在.net和WPF中理解线程和同步

本文关键字:线程 同步 net WPF | 更新日期: 2023-09-27 17:49:57

我一直在C++编程多年,然后转移到.NET。到目前为止,一切都很容易理解了,但是我仍然对同步的事情(理论上)感到困惑。

我记得在Stackoverflow上看到运行Task实际上不会创建一个新线程!这让我很困惑。

异步任务在.NET中如何运行?

你能解释一下为什么

var value = await Task<int>.Run(() => { return 10; } );

不生成一个新线程?它是怎么做的呢?

还有,Dispatcher.BeginInvokeWPF到底有什么关系呢?

在.net和WPF中理解线程和同步

任务在 TaskSchedulers上运行。调度程序可以做任何事情,但最常见的默认调度程序使用CLR线程池。启动一个任务可能会启动一个新线程或重用一个现有线程。没有必要能够分辨出其中的区别。

您可以使用TaskCreationOptions.LongRunning强制启动一个新线程。

await与此完全无关。await挂起当前方法的执行,直到等待的"事情"完成。它永远不会开始,它只会等待。

注意,Task<int>.Run应该是Task.Run。这两个表达式绑定到同一个方法(Task.Run),但前一个是误导。

Dispatcher.BeginInvoke与这些都没有关系。您可以使用此方法来获得在WPF UI线程上运行的任意委托。