【问题标题】:.NET Dispatcher, for .NET Core?.NET 调度程序,用于 .NET Core?
【发布时间】:2017-06-04 12:55:16
【问题描述】:

.NET Core 是否存在类似 Dispatcher 的内容?

我需要在 .NET Core 中创建一个线程,并且能够发送要在该线程上调用的操作。另外,我希望能够使用可用于async/await 东西的TaskScheduler

这是否存在于某个地方?

【问题讨论】:

  • 我在这里没有看到任何研究证据。你能提供一些链接并解释它们对你没有帮助吗?
  • AFAIK Task.Run 应该仍然存在并且运行良好,您已经尝试过了吗? Dispatcher 对于 GUI 应用程序等非常重要。
  • WindowsBaseDispatcher)所在的位置,不能在 .NET Core 上运行,只能在普通 CLR 上运行。
  • 听起来不像是 .NET Framework 与 .NET Core 的问题,而是 GUI 与控制台应用程序与 Web 服务的问题。 Web 服务没有长期存在的线程,它们是请求驱动的。无论您在 .NET Core 上构建何种项目类型,即使您使用完整的 .NET Framework 构建它,也无法访问 Dispatcher
  • 由于需要一段时间来解释的原因,我有必须从单个线程管理的本机对象。我还有来自其他来源的事件处理程序,需要在创建本机对象的DispatcherThread 上引发。 TaskScheduler.Default 使用线程池。如果我可以引用WindowsBase,这可以完成,但我不能。这是一个长期运行的控制台服务。

标签: c# .net .net-core


【解决方案1】:

它不是内置的,但我的 AsyncContext and AsyncContextThread types 可以在满足您需要的库中找到。

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 提供 SynchronizationContextTaskScheduler/TaskFactory

【讨论】:

  • 所以,如果我不想在AsyncCOntext.Run 内部的控制台应用程序中运行“UI”线程,我会得到SynchronizationContext,然后执行while(!exit) { await Task.Yeild(); }?然后,使用SynchronizationContext,我可以使用它来安排要在该线程上执行的任务吗?
  • @PaulKnopf:如果您想要一个单独的线程,可以将工作排入队列,我建议您使用AsyncContextThread,如图所示。无需捕获SynchronizationContext - 只需使用AsyncContextThread.Factory 来排队工作。您也不需要while - 线程等待更多工作,直到调用Join/JoinAsync/Dispose
  • 漂亮!非常感谢,非常感谢!
【解决方案2】:

在 .NET Core 3.0 中,您现在可以使用 Dispatcher 类,但它只能在 Windows 和 netcoreapp3.0 TFM 下运行,因此您无法在 Linux 或 Mac 上部署应用程序。

您应该在您的 CSharp 项目中添加以下参数

<PropertyGroup>
   ...
   <UseWPF>true</UseWPF>
   ...
</PropertyGroup>

然后你可以在你的应用程序中使用System.Windows.Threading.Dispatcher

【讨论】:

    【解决方案3】:

    检查 .csproj 中的 SDK 引用是否指向 Microsoft.NET.Sdk.WindowsDesktop,请参阅 here

    【讨论】:

      【解决方案4】:

      作为参考:你可以像 codevision 和 JBSnorro 的答案一样:

      手动编辑 .csproj 文件。项目文件应该类似于以下内容(对于 Core 3.1,使用 3.1 而不是 3.0):

      <Project Sdk="Microsoft.NET.Sdk.WindowsDesktop">
          <PropertyGroup>
              <TargetFramework>netcoreapp3.0</TargetFramework>
              <UseWPF>true</UseWPF>
          </PropertyGroup>
      </Project>
      

      如果项目已卸载,请使用内容菜单中的重新加载项目。

      注意:应添加 UseWPF,但也应修改“Project Sdk”类型。

      【讨论】:

      • WindowsDesktop 部分很重要。只是 &lt;UseWPF&gt;true&lt;/UseWPF&gt; 对我不起作用。
      猜你喜欢
      • 2017-07-31
      • 2020-01-10
      • 2011-08-12
      • 2018-03-11
      • 1970-01-01
      • 2023-01-24
      • 2023-03-19
      • 2020-10-27
      • 1970-01-01
      相关资源
      最近更新 更多