C# 延迟然后执行任务
快速提问,我想在启动无返回值的异步任务之前等待一秒钟。C# 延迟然后执行任务,c#,.net,asynchronous,task-parallel-library,C#,.net,Asynchronous,Task Parallel Library,快速提问,我想在启动无返回值的异步任务之前等待一秒钟。 这样做对吗 Task.Delay(1000) .ContinueWith(t => _mq.Send(message)) .Start(); 异常会发生什么情况?如果您等待任务,您将能够观察到任何异常 正在运行的用户代码引发的未处理异常 在任务内部传播回加入线程,但在 本主题后面将介绍的某些场景。例外情况 在使用静态或实例任务时传播。请等待或 Wait方法,并通过封闭调用来处理它们 在try-catch语句中 摘自
这样做对吗
Task.Delay(1000)
.ContinueWith(t => _mq.Send(message))
.Start();
异常会发生什么情况?如果您等待任务,您将能够观察到任何异常 正在运行的用户代码引发的未处理异常 在任务内部传播回加入线程,但在 本主题后面将介绍的某些场景。例外情况 在使用静态或实例任务时传播。请等待或 Wait方法,并通过封闭调用来处理它们 在try-catch语句中 摘自
注意时间安排。任务使用调度程序,不保证在您说“开始”时启动。在告诉代码启动后,您的代码将保证至少1000毫秒的延迟,但不能保证精确到1000毫秒。如果等待任务完成,您可以捕获任务中引发的任何异常: 请注意,任务中抛出的异常将是内部异常
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");
}
}
首先,Start()。在所有其他情况下,它将抛出异常,因为任务
已启动或正在等待另一个任务
现在,最好的方法可能是将代码放入一个单独的async
方法中,并使用await
:
async Task SendWithDelay(Message message)
{
await Task.Delay(1000);
_mq.Send(message);
}
如果执行此操作,则Send()
方法中的任何异常都将在返回的任务中结束
如果您不想这样做,使用ContinueWith()
是一种合理的方法。在这种情况下,异常将出现在从ContinueWith()返回的任务中
此外,根据<代码>类型> MQ,请考虑使用<代码> SeDaSycNo()/<代码>,如果有类似的信息可用。
为什么使用异步CTP?最终版本已经发布很长时间了。如果可以使用异步方法,则不需要手动使用ContinueWith,只需等待延迟。你能提供更多的上下文吗?是的,这是最好的方法。对于异常处理:@jon:error tag:)它正在windows服务中使用。@jonsket他可能被限制在.Net 4(为了XP兼容性)中,并且不喜欢闲聊编译器和目标包。这与我的立场类似。即使在.NET4中,您也可以使用BCL异步。Acync CTP仅适用于VS 2010上的.NET。顺便说一句,无需调用Start()
,Delay
已启动任务