在.net和WPF中理解线程和同步
本文关键字:线程 同步 net WPF | 更新日期: 2023-09-27 17:49:57
我一直在C++
编程多年,然后转移到.NET
。到目前为止,一切都很容易理解了,但是我仍然对同步的事情(理论上)感到困惑。
我记得在Stackoverflow上看到运行Task
实际上不会创建一个新线程!这让我很困惑。
异步任务在.NET
中如何运行?
你能解释一下为什么
var value = await Task<int>.Run(() => { return 10; } );
不生成一个新线程?它是怎么做的呢?
还有,Dispatcher.BeginInvoke
和WPF
到底有什么关系呢?
任务在 TaskScheduler
s上运行。调度程序可以做任何事情,但最常见的默认调度程序使用CLR线程池。启动一个任务可能会启动一个新线程或重用一个现有线程。没有必要能够分辨出其中的区别。
您可以使用TaskCreationOptions.LongRunning
强制启动一个新线程。
await
与此完全无关。await
挂起当前方法的执行,直到等待的"事情"完成。它永远不会开始,它只会等待。
注意,Task<int>.Run
应该是Task.Run
。这两个表达式绑定到同一个方法(Task.Run
),但前一个是误导。
Dispatcher.BeginInvoke
与这些都没有关系。您可以使用此方法来获得在WPF UI线程上运行的任意委托。