Ned*_*nov 11 c# asynchronous async-await
我只是在尝试看待Task等待冷任务(即尚未启动的)时会发生什么.令我惊讶的是,代码只是永远挂起而且"Finsihed "从未打印过.我希望抛出异常.
public async Task Test1()
{
var task = new Task(() => Thread.Sleep(1000));
//task.Start();
await task;
}
void Main()
{
Test1().Wait();
Console.WriteLine("Finished");
}
Run Code Online (Sandbox Code Playgroud)
然后我或许可以从另一个线程启动任务,所以我将代码更改为:
public async Task Test1()
{
var task = new Task(() => Thread.Sleep(1000));
//task.Start();
await task;
Console.WriteLine("Test1 Finished");
}
void Main()
{
var task1 = Test1();
Task.Run(() =>
{
Task.Delay(5000);
task1.Start();
});
task1.Wait();
Console.WriteLine("Finished");
}
Run Code Online (Sandbox Code Playgroud)
但它仍被阻止task1.Wait().有人知道在等待之后是否有办法开始冷却任务?
否则似乎没有必要能够执行await冷任务,所以也许任务应该在等待时启动或者应该抛出异常.
更新
我正在等待错误的任务,即返回的外部任务Test1而不是其中的新任务.@Jon Skeet提到的InvalidOperationException被抛入其中,Task.Run但是因为没有观察到生成的任务,所以主线程上没有抛出异常.将try/catch内部Task.Run或调用Wait()或Result返回的任务Task.Run放在主控制台线程上引发异常.
Jon*_*eet 14
您正在尝试启动异步方法返回的任务 - 这不是您开始使用的冷任务.实际上,如果您为Task.Run调用添加一些诊断,您将看到抛出异常:
System.InvalidOperationException:可能不会在promise样式的任务上调用Start.
这是一个显示我认为你真正想要做的事情的例子:
using System;
using System.Threading;
using System.Threading.Tasks;
public class Test
{
static void Main(string[] args)
{
// Not using Task.Delay! That would be pointless
Task t1 = new Task(() => Thread.Sleep(1000));
Task t2 = Await(t1);
Console.WriteLine(t2.Status);
Console.WriteLine("Starting original task");
t1.Start();
Console.WriteLine(t2.Status);
t2.Wait();
Console.WriteLine(t2.Status);
}
static async Task Await(Task task)
{
Console.WriteLine("Beginning awaiting");
await task;
Console.WriteLine("Finished awaiting");
}
}
Run Code Online (Sandbox Code Playgroud)
注意使用Thread.Sleep而不是Task.Delay; 除非你使用的结果Task.Delay,它基本上什么都不做.使用Thread.Sleep是模拟在其他任务中完成的实际工作.
至于等待未开始的任务的原因并没有例外 - 我认为这是合理的,说实话.它允许上述情况有效,这在某些情况下可以使生活更轻松.(例如,您可以在启动它们之前创建许多任务 - 您可能希望在启动它们之前开始等待它们完成.)
| 归档时间: |
|
| 查看次数: |
1093 次 |
| 最近记录: |