Tag: 异步 等待

使用async / await和任务优化火灾和忘记

我有大约500万件要更新。 我并不真正关心响应(响应会很好,所以我可以记录它,但我不想要响应,如果这会花费我的时间。)话虽如此,这段代码是否优化为运行为尽可能快? 如果有500万个项目,我是否会冒任务被取消或超时错误的风险? 我每秒钟会得到大约1或2个回复。 var tasks = items.Select(async item => { await Update(CreateUrl(item)); }).ToList(); if (tasks.Any()) { await Task.WhenAll(tasks); } private async Task Update(string url) { var client = new HttpClient(); var response = await client.SendAsync(url).ConfigureAwait(false); //log response. } 更新:我实际上正在获取TaskCanceledExceptions。 我的系统用完线程了吗? 我该怎么做才能避免这种情况?

无法将lambda表达式转换为类型“…”,因为它不是委托类型

美好的一天! 我试图使用lambda表达式编写一个匿名方法,该表达式将从异步任务返回一个对象。 我想在构造函数中执行此操作,因此这是我无法使其父方法异步的原因。 ReadJsonAsync方法返回一个Session对象。 我会告诉你相关的代码: Session session; fileService = new FileService(); session = async () => { return await fileService.ReadJsonAsync() }; 提前致谢!

如何创建自定义SynchronizationContext,以便我自己的单线程事件循环可以处理所有延续?

假设您正在编写自定义单线程GUI库(或带有事件循环的任何内容)。 根据我的理解,如果我使用async/await ,或只是常规的TPL延续,它们都将在TaskScheduler.Current (或SynchronizationContext.Current )上进行调度。 问题是延续可能想要访问库的单线程部分,这意味着它必须在同一个事件循环中执行。 例如,给定一个简单的游戏循环,事件可能会像这样处理: // All continuation calls should be put onto this queue Queue events; // The main thread calls the `Update` method continuously on each “frame” void Update() { // All accumulated events are processed in order and the queue is cleared foreach (var event : events) Process(event); events.Clear(); } […]

这是async-await如何工作的正确图表吗?

我将尝试发表关于async的讨论 – await ,我正在创建一个试图显示可能的执行顺序的流程图。 我试图将其作为段落的基础 异步方法的开始就像任何其他方法一样执行。 也就是说,它会同步运行,直到遇到“await”(或抛出exception)。 “await”关键字是事物可以异步的地方。 Await就像一个一元运算符:它需要一个参数,一个等待(“等待”是一个异步操作)。 等待检查等待它是否已经完成; 如果等待已经完成,那么该方法就会继续运行(同步,就像常规方法一样)。 如果“等待”看到等待尚未完成,那么它将异步行动。 它告诉等待在完成时运行方法的其余部分,然后从异步方法返回。 稍后,当等待完成时,它将执行异步方法的剩余部分。 如果您正在等待内置等待(例如任务),则异步方法的其余部分将在“await”返回之前捕获的“上下文”上执行。 来自http://blog.stephencleary.com/2012/02/async-and-await.html

C#async /等待控制台应用程序中的奇怪行为

我构建了一些异步/等待演示控制台应用程序并得到奇怪的结果。 码: class Program { public static void BeginLongIO(Action act) { Console.WriteLine(“In BeginLongIO start… {0} {1}”, (DateTime.Now.Ticks – ticks) / TimeSpan.TicksPerMillisecond, Thread.CurrentThread.ManagedThreadId); Thread.Sleep(1000); act(); Console.WriteLine(“In BeginLongIO end… \t{0} {1}”, (DateTime.Now.Ticks – ticks) / TimeSpan.TicksPerMillisecond, Thread.CurrentThread.ManagedThreadId); } public static Int32 EndLongIO() { Console.WriteLine(“In EndLongIO start… \t{0} {1}”, (DateTime.Now.Ticks – ticks) / TimeSpan.TicksPerMillisecond, Thread.CurrentThread.ManagedThreadId); Thread.Sleep(500); Console.WriteLine(“In EndLongIO […]

async / await返回callchain是如何工作的?

我最近有一种情况,我有一个ASP.NET WebAPI控制器,需要在其action方法中对另一个REST服务执行两个Web请求。 我编写了我的代码,将function完全分离为单独的方法,看起来有点像这个例子: public class FooController : ApiController { public IHttpActionResult Post(string value) { var results = PerformWebRequests(); // Do something else here… } private IEnumerable PerformWebRequests() { var result1 = PerformWebRequest(“service1/api/foo”); var result = PerformWebRequest(“service2/api/foo”); return new string[] { result1, result2 }; } private string PerformWebRequest(string api) { using (HttpClient client = new HttpClient()) […]

等待新任务(…):任务不运行?

这里问的一个问题的延续: 在前面提到的问题中,我有以下函数返回Task类型的对象(用于增量测试目的): private static Task GetInstance( ) { return new Task( (Func<Task>)(async ( ) => { await SimpleMessage.ShowAsync( “TEST” ); return new object( ); } ) ); } 当我调用await GetInstance( ); ,函数被调用(我假设任务被返回,因为没有抛出exception),但随后任务就在那里。 我只能猜测我做错了。 我不希望此函数返回已在运行的任务(即IMPERATIVE )。 如何异步运行此函数返回的任务?

C#任务什么时候开始?

任务什么时候开始? public void DoSomething() { Task myTask = DoSomethingAsync(); Task.WaitAll(new[] { myTask }, 2000); } public async Task DoSomethingAsync() { await SomethingElse(); } 在Task myTask = DoSomethingAsync();初始化时是否立即启动Task myTask = DoSomethingAsync(); 或者当你说在Task.WaitAll(new[] { myTask }, 2000);等待它时它会开始Task.WaitAll(new[] { myTask }, 2000); ?

c#中的异步属性

在我的Windows 8应用程序中有一个全局类,其中有一些静态属性,如: public class EnvironmentEx { public static User CurrentUser { get; set; } //and some other static properties //notice this one public static StorageFolder AppRootFolder { get { return KnownFolders.DocumentsLibrary .CreateFolderAsync(“theApp”, CreationCollisionOption.OpenIfExists) .GetResults(); } } } 您可以看到我想在项目的其他位置使用应用程序根文件夹,因此我将其设置为静态属性。 在getter中,我需要确保根文件夹存在,否则创建它。 但CreateFolderAsync是一个异步方法,这里我需要一个同步操作。 我尝试了GetResults()但它抛出了一个InvalidOperationException 。 什么是正确的实施? (package.appmanifest已正确配置,实际创建了该文件夹。)

使用Async Await返回View

我有一个我想在后台运行的流程。 只需单击操作链接即可执行此操作。 致电行动: public async Task ProcessRec() { await Task.Run(() => waitTimer()); return RedirectToAction(“Index”, “Home”); } public void waitTimer() { Thread.Sleep(10000); } 然而,在将我重定向到“Index,Home”动作之前,等待整整10秒。 我是Await / Async的新手,所以我知道我在这里解释错误。 当waitTimer在后台执行时,如何让应用程序返回此操作? 谢谢!!