Dav*_*vid 41 .net c# asynchronous task-parallel-library
快问,我想在启动没有返回值的异步任务之前等待一秒钟.
这是正确的方法吗?
Task.Delay(1000)
.ContinueWith(t => _mq.Send(message))
.Start();
Run Code Online (Sandbox Code Playgroud)
异常会发生什么?
svi*_*ick 39
首先,Start()只适用于Task使用Task构造函数(例如new Task(() => _mq.Send(message)))创建的(非常罕见的)s .在所有其他情况下,它将抛出异常,因为Task它已经启动或等待另一个异常Task.
现在,可能最好的方法是将代码放入一个单独的async方法并使用await:
async Task SendWithDelay(Message message)
{
await Task.Delay(1000);
_mq.Send(message);
}
Run Code Online (Sandbox Code Playgroud)
如果这样做,Send()方法中的任何异常都将以返回的方式结束Task.
如果您不想这样做,使用ContinueWith()是一种合理的方法.在这种情况下,异常将在Task返回的ContinueWith().
此外,根据类型_mq,考虑使用SendAsync(),如果有类似的东西可用.
Att*_*ila 11
如果等待任务完成,您可以捕获任务中抛出的任何异常:
请注意,在Task中抛出的Exception将是内部的
class Program
{
static void Main(string[] args)
{
try
{
Task task = Task.Delay(1000)
.ContinueWith(t => Program.throwsException());
task.Wait();
}
catch (Exception ex)
{
Console.WriteLine("Exception:" + ex.Message); // Outputs: Exception:One or more errors occurred.
Console.WriteLine("Inner exception:" + ex.InnerException.Message); // Outputs: Exception:thrown
}
Console.ReadKey();
}
static void throwsException()
{
Console.WriteLine("Method started");
throw new Exception("thrown");
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
54706 次 |
| 最近记录: |