只是想了解为什么SleepAsyncB不使用线程:TaskCompletionSource具有更好的可伸缩性?
的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;
}
这是从一本书吗?我会使用(并等待)Task.Delay ... https://msdn.microsoft.com/en-us/magazine/jj991977.aspx =>请参见图5 – Fildor
关于您的问题:SleepAsyncA阻止TP线程为其整个运行时间。 SleepAsyncB不会因为Timer可以使用不需要实际线程被阻塞的本机功能。 _“但我想Timer本身是独立的线程?” - - 不,它不是。 – Fildor