Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET调度程序,用于.NET核心?_C#_.net_.net Core - Fatal编程技术网

C# .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

对于.NET核心是否存在类似于
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>