我有以下代码:
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));
答案 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