C# .NET调度程序,用于.NET核心?
对于.NET核心是否存在类似于C# .NET调度程序,用于.NET核心?,c#,.net,.net-core,C#,.net,.net Core,对于.NET核心是否存在类似于Dispatcher的东西 我需要在.NETCore中创建一个线程,并能够发送要在该线程上调用的操作。另外,我希望能够使用TaskScheduler,它可以用于async/await东西 这是否存在于某个地方?它不是内置的,但我的产品可以在一个适合您需要的库中找到 AsyncContext接管当前线程: AsyncContext.Run(async () => { ... // any awaits in here resume on the same t
Dispatcher
的东西
我需要在.NETCore中创建一个线程,并能够发送要在该线程上调用的操作。另外,我希望能够使用TaskScheduler
,它可以用于async/await
东西
这是否存在于某个地方?它不是内置的,但我的产品可以在一个适合您需要的库中找到
AsyncContext
接管当前线程:
AsyncContext.Run(async () =>
{
... // any awaits in here resume on the same thread.
});
// `Run` blocks until all async work is done.
AsyncContextThread
是一个单独的线程,具有自己的AsyncContext
:
using (var thread = new AsyncContextThread())
{
// Queue work to the thread.
thread.Factory.Run(async () =>
{
... // any awaits in here resume on the same thread.
});
await thread.JoinAsync(); // or `thread.Join();`
}
AsyncContext
提供了一个SynchronizationContext
以及一个TaskScheduler
/TaskFactory
使用.NET Core 3.0,您现在可以使用Dispatcher
类,但它只能在Windows和netcoreapp3.0
TFM下工作,因此您无法在Linux或Mac上部署应用程序
您应该向CSharp项目添加以下参数
<PropertyGroup>
...
<UseWPF>true</UseWPF>
...
</PropertyGroup>
...
真的
...
然后,您可以在应用程序中使用
System.Windows.Threading.Dispatcher
。检查.csproj中的SDK引用是否指向Microsoft.NET.SDK.WindowsDesktop
,请参阅。就像引用一样:您可以像codevision和JBSnoro的答案一样:
手动编辑.csproj文件。项目文件应类似于此(对于Core 3.1,使用3.1而不是3.0):
netcoreapp3.0
真的
如果项目已卸载,请使用“内容”菜单中的“重新加载项目”
注意:应该添加UseWPF,但也应该修改“Project Sdk”类型。我在这里没有看到任何研究证据。你能提供一些链接并解释它们是如何帮不到你的吗?一个aik任务。Run应该仍然存在并且运行正常,你已经尝试过了吗?Dispatcher对于GUI应用程序之类的东西非常重要。
WindowsBase
(这就是Dispatcher
)不是在.NET核心上运行的,只有普通的CLR。听起来不像是.NET框架与.NET核心之间的问题,而是GUI与控制台应用程序与web服务之间的问题。Web服务没有长寿命的线程,它们是请求驱动的。无论您在.NET Core上构建的是何种项目类型,即使您使用完整的.NET Framework构建它,也将无法访问Dispatcher
。出于需要一段时间才能解释的原因,我有必须从单个线程管理的本机对象。我还需要在创建本机对象的Dispatcher
或Thread
上引发来自另一个源的事件处理程序。TaskScheduler.Default
使用线程池。如果我可以引用WindowsBase
,这是可以做到的,但我不能。这是一个长期运行的控制台服务。因此,如果我不想在控制台应用程序中运行“UI”线程,在AsyncCOntext.run
中,我会获取SynchronizationContext
,然后在(!exit){wait Task.Yeild();}时执行?然后,使用SynchronizationContext
,我可以使用它来安排要在该线程上执行的任务。@PaulKnopf:如果您想要一个单独的线程来对工作进行排队,我建议使用AsyncContextThread
,如图所示。无需捕获SynchronizationContext
——只需使用AsyncContextThread.Factory
对工作进行排队即可。您也不需要,
-线程等待更多的工作,直到调用Join
/JoinAsync
/Dispose
。漂亮!非常感谢,非常感谢!WindowsDesktop
部分很重要。只是true
对我不起作用。
<Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<UseWPF>true</UseWPF>
</PropertyGroup>
</Project>