如何在使用Task时延迟动作执行

时间:2018-02-22 10:02:04

标签: c#

我有以下代码:

Action<CancellationToken> act1 = tk1 => {
   //sleep for 5 seconds
   Console.WriteLine(...);
};

Task t1 = new Task(() => execute(act1));

t1.Start();

如何在内部行动?我尝试过:

Thread.Sleep(TimeSpan.FromSeconds(5));

Task.Delay(TimeSpan.FromSeconds(5));

3 个答案:

答案 0 :(得分:4)

Task.Delay(TimeSpan.FromSeconds(5));

创建了一个默认运行异步的新Task。因此,您的方法将继续独立于Task运行。您可以选择与Task进行同步。

如果您使用async方法,则可以等待Task

await Task.Delay(TimeSpan.FromSeconds(5));

否则,您可以始终使用Task.Wait

Task.Delay(TimeSpan.FromSeconds(5)).Wait();

这将阻止该方法,直到Task完成运行。

在您的情况下,您可以制作Lambda async

Action<CancellationToken> act1 = async tk1 => {
   await Task.Delay(TimeSpan.FromSeconds(5), tk1);
   Console.WriteLine(...);
};

答案 1 :(得分:3)

试试这个:

Action<CancellationToken> act1 = async tk1 =>
{
    await Task.Delay(TimeSpan.FromSeconds(5.0));
    Console.WriteLine("Hello, World!");
};

act1(default(CancellationToken));

答案 2 :(得分:0)

Action委托与void方法相同。这使得使用与async相同的async void操作应该避免使用。

参考Async/Await - Best Practices in Asynchronous Programming

使用返回Func的{​​{1}}委托,使该函数异步,然后您可以Task使用await

Task.Delay