【问题标题】:Is it possible to create Dispatcher (System.Windows.Threading) for a non-UI worker thread?是否可以为非 UI 工作线程创建 Dispatcher (System.Windows.Threading)?
【发布时间】:2020-10-03 18:41:48
【问题描述】:

实际上,我希望有一个专用的工作线程来处理来自主线程和其他工作线程的事件。该线程还必须能够调用其他线程中的委托。 (线程从主线程接收命令,在其他工作线程中执行其中一些命令,处理来自这些命令的完成和进度事件,并通知主线程他正在做什么)。

所有这些都可以通过在所需线程中实现来自委托的消息队列的模拟来手动完成。但是,如果存在这种情况,我更喜欢更高级别的方法。从文档中我得到的印象是 Dispatcher 类非常适合此目的。我也觉得可以在任何线程中创建此类的对象,但没有找到任何示例。我的感觉不对吗?

【问题讨论】:

标签: c# multithreading


【解决方案1】:

没有任何内置功能,但很容易创建自定义TaskScheduler 来安排特定线程上的工作。大多数实现使用方便的BlockingCollection 类作为队列。 Here 是一种实现,here 是另一种实现。您可以根据需要自定义这些实现中的任何一个,然后像这样使用它:

var myScheduler = new SingleThreadTaskScheduler();
var task = Task.Factory.StartNew(() => DoSomething(), default,
    TaskCreationOptions.None, myScheduler);

还可以选择使用花哨的TaskFactory 类,这样你就可以用更少的代码在这个调度器上启动任务:

var myFactory = new TaskFactory(new SingleThreadTaskScheduler());
var task = myFactory.StartNew(() => DoSomething());

我个人不是这个类的粉丝,因为它让我对TaskFactoryTask.Factory 属性之间的相似性感到困惑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-08
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多