试图理解为什么SleepAsyncB不使用线程:
SleepAsyncA方法使用线程池中的线程 睡眠。然而,第二种方法有一个完整的方法 不同的实现,在等待时不占用线程 要运行的计时器。第二种方法为您提供了可扩展性。
我想方法SleepAsyncB通过Win API创建Timer并提供回调。但我想Timer本身就是单独的线程吗?
public static Task SleepAsyncA(int millisecondsTimeout)
{
return Task.Run(() =>
{
Thread.Sleep(millisecondsTimeout);
});
}
public static Task SleepAsyncB(int millisecondsTimeout)
{
TaskCompletionSource<bool> tcs = null;
var t = new Timer(delegate { tcs.TrySetResult(true); }, null, -1, -1);
tcs = new TaskCompletionSource<bool>(t);
t.Change(millisecondsTimeout, -1);
return tcs.Task;
}
答案 0 :(得分:0)
SleepAsyncA
将强制一个线程从TPL ThreadPool进入休眠状态millisecondsTimeout
,有效地使该线程无法使用。
SleepAsyncB
,通过使用Timer,延迟一段代码以便稍后执行,而不是阻塞线程直到millisecondsTimeout
过去。这不使用Thread,因为这是操作系统提供的本机功能。
另外,正如@Fildor已经在评论中说明的那样,SleepAsyncB
代码可以被Task.Delay(millisecondsTimeout)
的单个调用替换(假设Timer是System.Threading.Timer
)