代码之家  ›  专栏  ›  技术社区  ›  superpuccio Kasra

创建新的Dispatcher

  •  2
  • superpuccio Kasra  · 技术社区  · 9 年前

    在我的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,我无法访问 线 班我不知道如何创建线程并从中提取Dispatcher。提前谢谢。

    2 回复  |  直到 9 年前
        1
  •  1
  •   Stephen Cleary    9 年前

    在某一点上,我想停止并行,我想让调用按顺序进行(按顺序)。我想创建一种频道。为此,我需要一个名为ChannelThread的线程。如果我有那个线程的分派器,我就可以调用那个分派器上的函数。因此,我将确保调用按顺序发生。

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

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

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

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

    要将工作排队到块:

    fifo.Post(() => { /* work */ });
    
        2
  •  0
  •   Jeffrey Chen    9 年前

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

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

    Using the thread pool in Windows Runtime apps

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

    例如:

    await RunTask1Async();
    await RunTask1Async();
    

    或使用Task类

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