Tag: async await

Task.WaitAll()无法按预期工作

我正在试图弄清楚如何使用Task类。 在过去我总是使用常规的Thread类,但我正在尝试掌握所有的异步编程…… 作为一个例子,我创建了一个包含所有代码的主Winforms应用程序。 我的问题的相关代码是: //Relevant delegates public delegate void MethodAction(int num); public delegate void MethodConversion(); public delegate void OnCompletionAction(string completiontext); //Button user presses private void button4_Click(object sender, EventArgs e) { richTextBox1.Clear(); sw.Reset(); sw.Start(); Sync.RunAsync3(calcSim); } //The method that simulates a calculation by adding a sleep //the input param threadlength is just to allow threads to […]

等待方法中的取消令牌

将令牌放在任务的构造函数中有很多理由,这里提到: Task构造函数中的取消令牌:为什么? 使用关键字,async / await,这是如何工作的? 例如我的代码如下: public async Task MethodAsync(CancellationToken token) { await Method01Async(); await Method02Async(); } 虽然它是一个异步过程。 我很快就使用了“Task.StartNext”或“Task.Run”或“new Task”。 为了能够指定我的取消令牌,我该怎么办?

等待任务中的Task.WhenAll()等待

我的问题是当一个Task有一个Task.WhenAll()调用(运行其他任务)时,WhenAll()行让消费代码继续执行,这与我的预期不同。 因此,当命中Task.WhenAll()时,以下代码立即输出“finished”,而不是在其参数中的所有任务完成之后。 // Just a simple async method public Task DoWorkAsync() { return Task.Factory.StartNew( () => { // Working }); } // This one used the previous one with Task.WhenAll() public Task DoLoadsOfWorkAsync() { return Task.Factory.StartNew( async () => { // Working // This line makes the task return immediately await Task.WhenAll(DoWorkAsync(), DoWorkAsync()); // Working […]

Thread.Sleep(2500)与Task.Delay(2500).Wait()

我想要澄清一下。 我知道Task.Delay将在内部使用Timer,它显然是基于任务的(等待),而Thread.Sleep将导致线程被阻止。 但是,在任务上调用.Wait会导致线程被阻塞吗? 如果没有,可以假设Task.Delay(2500).Wait()优于Thread.Sleep(2500) 。 这与我正在调用的SO问题/答案略有不同.Wait() 。

我应该总是使用Task.Delay而不是Thread.Sleep吗?

我最近看到几条建议说明Thread.Sleep永远不应该用在生产代码中(最近在这个SO问题中 )。 其中许多人主张使用Task.Delay 。 我发现的大多数解释都使用UI应用程序作为示例,因为Task.Delay的优点是显而易见的(不阻止UI)。 在我的例子中,我在一个等待循环中使用Thread.Sleep来轮询WCF服务的特定条件,如下所示: DateTime end = DateTime.UtcNow + TimeSpan.FromMinutes(2); while (DateTime.UtcNow < end) { if (ExternalServiceIsReady() == true) { return true; } Thread.Sleep(1000); } 在这种情况下, Task.Delay的以下潜在优势似乎不适用: 睡眠时间相对于大约15毫秒的典型定时器分辨率相当大,因此Task.Delay准确性增加似乎微不足道。 该进程是单线程(非UI),必须阻塞直到条件为真,因此使用await在这里没有优势。 不需要取消延迟的能力。 这是一个适合使用Thread.Sleep吗? 用Task.Delay(1000).Wait()替换我的睡眠线会有什么好处(如果有的话) Task.Delay(1000).Wait() ?

处理异步方法的同步部分中的exception

我正在处理我开始的任务可能抛出的情况,同时仍然在初始线程上同步执行。 出于说明目的,这样的事情: static async Task TestAsync() { var random = new Random(Environment.TickCount).Next(); if (random % 2 != 0) throw new ApplicationException(“1st”); await Task.Delay(2000); Console.WriteLine(“after await Task.Delay”); throw new ApplicationException(“2nd”); } 从调用代码,我希望能够捕获任何exception,可能从同步部分抛出(即, await Task.Delay() )。 这是我目前正在做的事情: static void Main(string[] args) { try { var task = TestAsync(); if (task.IsFaulted) task.GetAwaiter().GetResult(); Console.WriteLine(“TestAsync continues asynchronously…”); } catch (Exception […]

在.Net 4.0中使用差的mans async / await构造实现异步超时

动机 C#5.0异步/等待构造非常棒,但遗憾的是,微软只展示了.NET 4.5和VS 2012的候选版本,这些技术将在我们的项目中得到广泛采用需要一些时间。 在Stephen Toub的异步方法,C#迭代器和任务中,我发现了一个可以很好地用于.NET 4.0的替代方法。 还有十几个其他实现甚至可以在.NET 2.0中使用该方法,尽管它们看起来很少过时且function较少。 例 所以现在我的.NET 4.0代码看起来像(注释部分显示它是如何在.NET 4.5中完成的): //private async Task ProcessMessageAsync() private IEnumerable ProcessMessageAsync() { //var udpReceiveResult = await udpClient.ReceiveAsync(); var task = Task .Factory .FromAsync(udpClient.BeginReceive, udpClient.EndReceive, null); yield return task; var udpReceiveResult = task.Result; //… blah blah blah if (message is BootstrapRequest) { var typedMessage = ((BootstrapRequest)(message)); // […]

每个“等待”运算符都会导致状态机吗?

请考虑以下代码: public async Task GetString() { //Some code here… var data = await A(); //Some more code… return data; } private async Task A() { //Some code here.. var data = await B(); //manipulating data… return data; } private async Task B() { //Some code here.. var data = await C(); //manipulating data… return data; […]

异步递归。 我的记忆在哪里?

这更多地是出于好奇而不是任何现实世界的问题。 请考虑以下代码: void Main() { FAsync().Wait(); } async Task FAsync() { await Task.Yield(); await FAsync(); } 在同步世界中,这最终会导致堆栈溢出。 在异步世界中,这只会消耗大量内存(我认为这与我可能松散地称之为“异步堆栈”的内容有关?) 这些数据到底是什么,以及如何保存?

为什么我的异步ASP.NET Web API控制器阻塞主线程?

我有一个ASP.NET Web API控制器,我原本认为它可以异步操作。 控制器设计为第一次请求hibernate20秒,但立即为任何后续请求提供服务。 所以我预期的时间表是这样的: 提出要求1。 提出要求2。 提出要求3。 请求2返回。 请求3返回。 等~20秒。 请求1返回。 相反,在请求1完成之前, 没有请求返回。 我可以确认(基于调试输出),入口线程和困线程id是不同的。 我故意使用TaskCreationOptions.LongRunning强制将睡眠强制到一个单独的线程,但是在睡眠完成之前,应用程序仍然拒绝为任何新请求提供服务。 我是否遗漏了有关异步Web API控制器如何工作的基本信息? public class ValuesController : ApiController { private static bool _firstTime = true; public async Task Get() { Debug.WriteLine(“Entry thread id: {0}. Sync: {1}”, Thread.CurrentThread.ManagedThreadId, SynchronizationContext.Current); await LongWaitAsync(); return “FOOBAR”; } private Task LongWaitAsync() { return Task.Factory.StartNew(() => […]