创建新的调度程序

Create new Dispatcher

在我的 Windows Phone 8.1 应用程序中,我需要为 Thread 创建一个新的 Dispatcher。通常,我们可以这样做:

Dispatcher dispatcher = null;

ManualResetEvent dispatcherReadyEvent = new ManualResetEvent(false);

new Thread(new ThreadStart(() =>
{
    dispatcher = Dispatcher.CurrentDispatcher;
    dispatcherReadyEvent.Set();
    Dispatcher.Run();
})).Start();

dispatcherReadyEvent.WaitOne();

dispatcher.Invoke(...);

问题是使用 Windows Phone 8.1,我无法访问 Thread class。我不明白如何创建线程并从中提取分派器。提前谢谢你。

不,您无法在 Windows Runtime App 中获取工作线程调度程序。在 .NET for Desktop 中,有一个 Dispatcher class 用于管理线程的工作项队列。但是在 Windows 运行时,只有 UI 线程有名为 CoreDispatcher 的调度程序。

将工作项提交到后台线程池。您可以使用方法 Windows.System.Threading.ThreadPool.RunAsync.

Using the thread pool in Windows Runtime apps

到运行顺序工作项,可以使用await关键字。

例如:

await RunTask1Async();
await RunTask1Async();

或者使用任务class

    var task = new Task(()=> {
        // work1
    }).ContinueWith((t)=> {
        // work2
    });

At a certain point I wanna stop parallelism and I want to make the calls sequential (following their order). I'd like to create a sort of channel. To do so I need a thread called, maybe, ChannelThread. If I had the dispatcher of that thread I can just call the functions on that dispatcher. So, I'll be sure the calls happen sequentially.

首先,停止考虑线程。在软件开发的这一点上,线程是一个实现细节。我建议采用可用的最高级别解决方案。

立即想到的两个是响应式扩展 (Rx) 和 TPL 数据流。由于您的问题中没有太多上下文,因此很难说 Rx 与您的解决方案集成的难易程度。 TPL 数据流提供了一个简单的 FIFO 缓冲区,您可以像这样使用它:

var fifo = new ActionBlock<Action>(action => action());

默认情况下,数据流块在线程池上执行并将它们的并发限制为一次一个,所以这就是您所需要的。

将工作排队到块:

fifo.Post(() => { /* work */ });