创建新的Dispatcher

时间:2015-08-12 16:06:26

标签: c# multithreading windows-runtime windows-phone-8.1 windows-phone

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

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课程。我不明白如何创建一个Thread并从中提取Dispatcher。提前谢谢。

2 个答案:

答案 0 :(得分:1)

  

在某一点上,我想要停止并行,我想按顺序进行调用(按照他们的顺序)。我想创建一种渠道。为此,我需要一个名为ChannelThread的线程。如果我有该线程的调度程序,我可以调用该调度程序上的函数。所以,我确定这些电话是按顺序发生的。

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

立即想到的两个是Reactive Extensions(Rx)和TPL Dataflow。由于您的问题没有太多背景信息,因此很难说Rx与您的解决方案的整合程度如何。 TPL Dataflow提供了一个简单的FIFO缓冲区,您可以像这样使用:

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

默认情况下,数据流块在线程池上执行,并将它们的并发性限制为一次一个,这样就可以了。

将工作排队到块:

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

答案 1 :(得分:0)

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

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

Using the thread pool in Windows Runtime apps

要按顺序运行工作项,可以使用await key-word。

例如:

await RunTask1Async();
await RunTask1Async();

或使用Task类

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