在我的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。提前谢谢。
答案 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
});