Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 延迟然后执行任务_C#_.net_Asynchronous_Task Parallel Library - Fatal编程技术网

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
已启动任务