延迟然后执行任务

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)