Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建新的调度程序_C#_Multithreading_Windows Runtime_Windows Phone 8.1_Windows Phone - Fatal编程技术网

C# 创建新的调度程序

C# 创建新的调度程序,c#,multithreading,windows-runtime,windows-phone-8.1,windows-phone,C#,Multithreading,Windows Runtime,Windows Phone 8.1,Windows Phone,在我的Windows Phone 8.1应用程序中,我需要为线程创建一个新的调度程序。通常,我们可以这样做: Dispatcher dispatcher = null; ManualResetEvent dispatcherReadyEvent = new ManualResetEvent(false); new Thread(new ThreadStart(() => { dispatcher = Dispatcher.CurrentDispatcher; dispa

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

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时,我无法访问
线程
类。我不明白如何创建线程并从中提取调度程序。提前感谢。

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

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

要按顺序运行工作项,可以使用wait关键字

例如:

await RunTask1Async();
await RunTask1Async();
或者使用任务类

    var task = new Task(()=> {
        // work1
    }).ContinueWith((t)=> {
        // work2
    });
在某一点上,我想停止并行,我想让调用按顺序进行(按照它们的顺序)。我想创建一种频道。为此,我需要一个名为ChannelThread的线程。如果我有该线程的调度程序,我可以调用该调度程序上的函数。所以,我会确保通话按顺序进行

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

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

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

Dispatcher.CurrentDispatcher
对所有应用程序都是相同的是,但我不想要当前线程(可能是UI线程)的Dispatcher。我想创建另一个线程并使用它的调度程序。谢谢你帮助我。你能描述一下你想完成什么吗?
Dispatcher
应该用来访问UI线程,通常只有一个UI线程。假设您有一些线程。每个线程调用整个系统中的一些函数。在某一点上,我想停止并行,我想让调用按顺序进行(按照它们的顺序)。我想创建一种频道。为此,我需要一个名为ChannelThread的线程。如果我有该线程的调度程序,我可以调用该调度程序上的函数。因此,我将确保调用按顺序进行。您可以使用C#中的事件模型来实现这一点,为什么在这里需要Dispatcher?
fifo.Post(() => { /* work */ });