我参考了《C# in a Nutshell》中的一个示例。根据文本,以下代码应该是非阻塞的,但我发现窗体要等待5秒钟才会显示。
private void Form1_Load(object sender, EventArgs e)
{
var tcs = new TaskCompletionSource<int>();
new Thread(() => {Thread.Sleep(5000); tcs.SetResult(42); }).Start();
Task<int> task = tcs.Task;
MessageBox.Show(task.Result.ToString());
}
我有一种感觉,这与Thread.Sleep()有关,而它把主线程放入休眠状态而不是新线程。
为什么会阻塞UI线程?
Task.Delay
来获取一个在 X 毫秒内完成的任务,而不是使用这种更加繁琐且会创建一个全新的任务却什么也不做(这相当昂贵)的方法。 - ServyTask.Delay()
是否也返回一个全新的Task
,它只是闲置在那里什么都不做(虽然不在新线程上)? - Frédéric HamidiTask.Delay
不需要创建一个新线程来坐着什么都不做。它使用计时器来指示任务应何时完成。这比创建新线程的方式更加可扩展,消耗的资源也少得多。 - Servy