我有以下代码:
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));
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(...);
};
尝试以下:
Action<CancellationToken> act1 = async tk1 =>
{
await Task.Delay(TimeSpan.FromSeconds(5.0));
Console.WriteLine("Hello, World!");
};
act1(default(CancellationToken));
Action
委托与void
方法相同。这使得使用async
操作与应避免的async void
相同。
参考异步/等待 - 异步编程中的最佳实践
使用返回Task
的Func
委托,使功能异步,然后可以使用Task.Delay
await
Func<CancellationToken, Task> func1 = async token => {
//sleep for 5 seconds
await Task.Delay(TimeSpan.FromSeconds(5), token);
Console.WriteLine(...);
};
await func1(cancellationToken);