C# 了解线程和与.NET和WPF的同步
我已经在C# 了解线程和与.NET和WPF的同步,c#,wpf,asynchronous,task,C#,Wpf,Asynchronous,Task,我已经在C++编程多年了,然后转到.NET。到目前为止,一切都更容易理解,但我仍在努力解决同步问题(理论上) 我记得在这里看到的Stackoverflow中,运行任务实际上不会创建新线程!这让我很困惑 异步任务如何在.NET中运行 你能解释一下原因吗 var value = await Task<int>.Run(() => { return 10; } ); var value=wait Task.Run(()=>{return 10;}); 不会产生新线程吗?它的作用是
C++
编程多年了,然后转到.NET
。到目前为止,一切都更容易理解,但我仍在努力解决同步问题(理论上)
我记得在这里看到的Stackoverflow中,运行任务
实际上不会创建新线程!这让我很困惑
异步任务如何在.NET
中运行
你能解释一下原因吗
var value = await Task<int>.Run(() => { return 10; } );
var value=wait Task.Run(()=>{return 10;});
不会产生新线程吗?它的作用是什么
另外,在
WPF
上Dispatcher.BeginInvoke
具体是什么?任务在TaskScheduler
s上运行。调度程序可以执行任何操作,但最常见的默认调度程序使用CLR线程池。启动任务可能会启动新线程或重用现有线程。没有必要分辨出区别
您可以使用TaskCreationOptions.LongRunning
强制启动新线程
wait
与此无关<代码>等待暂停当前方法的执行,直到等待的“事情”完成。它从不开始,它只是等待
注意,Task.Run
应该是Task.Run
。这两个表达式绑定到同一个方法(Task.Run
),但前一个表达式具有误导性
Dispatcher.BeginInvoke
与此无关。您可以使用此方法获取要在WPF UI线程上运行的任意委托。您可以在.NET中创建线程(就像使用C++),如果需要,您可以强制任务
-s在单独的线程上运行。不是答案,只是让您知道(如果您不是:)。任务是在线程池上执行的。他们可能需要也可能不需要专用于他们的新线程。如果你真的想要一个新的线程,你可以使用thread
class.Ok。但我如何知道任务何时在线程池上运行,何时不在线程池上运行?那么线程池在.NET上是如何工作的呢?@AlexandreSeverino.NET和所有这些高级语言将所有东西都“隐藏”起来,最终使所有东西都变得简单易用,以至于理解“背后到底发生了什么”变得复杂。亲切的问候,这是真的。我有时发现从实现细节的角度理解系统比只看保证更容易。