TaskCompletionSource是否具有更好的可扩展性?

时间:2017-09-27 09:29:03

标签: c# multithreading

试图理解为什么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;
        }

1 个答案:

答案 0 :(得分:0)

SleepAsyncA将强制一个线程从TPL ThreadPool进入休眠状态millisecondsTimeout,有效地使该线程无法使用。

SleepAsyncB,通过使用Timer,延迟一段代码以便稍后执行,而不是阻塞线程直到millisecondsTimeout过去。这不使用Thread,因为这是操作系统提供的本机功能。

另外,正如@Fildor已经在评论中说明的那样,SleepAsyncB代码可以被Task.Delay(millisecondsTimeout)的单个调用替换(假设Timer是System.Threading.Timer