我已在C++
编程多年,然后转到.NET
。到目前为止,一切都更容易理解,但我仍然在努力解决同步事情(理论上)。
我记得在 Stackoverflow 上看到,运行Task
实际上创建了一个新线程!这让我很困惑。
异步任务如何在.NET
中运行?
你能解释原因吗
var value = await Task<int>.Run(() => { return 10; } );
不会产生新线程?它取而代之的是什么?
此外,Dispatcher.BeginInvoke
上的WPF
到底是什么?
答案 0 :(得分:4)
任务在TaskScheduler
上运行。除了最常见的默认调度程序使用CLR线程池之外,调度程序可以执行任何操作。启动任务可能会启动新线程或重用现有线程。没有必要能够区分它们。
您可以使用TaskCreationOptions.LongRunning
强制启动新主题。
await
与此毫无关系。 await
暂停执行当前方法,直到等待的“事物”完成。它永远不会开始,它只等待。
请注意,Task<int>.Run
应为Task.Run
。这两个表达式绑定到同一个方法(Task.Run
),但前一个方法具有误导性。
Dispatcher.BeginInvoke
与此无任何关系。您可以使用此方法来获取在WPF UI线程上运行的任意委托。