Wpf Dispatcher暂停并继续

时间:2014-11-20 11:19:27

标签: c# wpf dispatcher

我有一个绑定到集合的列表视图。

使用dispatcher.current调度程序更新集合,以便将项目以增量方式添加到列表视图中。

Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
{
      if(continueDispatcher)numDone = DoStuff();
}));

这非常有效,并且continueDispatcher标志会使线程停止在其轨道中,这很酷,但我希望能够通过单击按钮继续执行调度程序操作。

我已阅读有关调度程序框架之类的内容,但我似乎无法找到有效的解决方案。

有没有人对这个问题有任何想法?

修改 - 更多代码

//for each image
foreach (var result in results)
{
    result.Type = type;

    numDone = LoadImagesAsync(result, numDone, total);
}

private int LoadImagesAsync(Item result, int numDone, int total)
{
    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
    {
        //keep looping
        while (true)
        {
            //if the dispatcher is paused then continue the loop
            if (DispatcherPaused) continue;

            //if the dispatcher is not paused then perform the action and break out of the loop
            numDone = DoStuff(result, numDone, total);
            break;
        }
    }));
    return numDone;
}

private int DoStuff(Item result, int numDone, int total)
{
    ItemList.Add(result);
    numDone++;
    ProgressBarValue = ((double) numDone/total)*100;
    return numDone;
}
  • C#
  • Visual Studio 2012

2 个答案:

答案 0 :(得分:1)

Thread t = new Thread(() =>
{
    while (true)
    {
       if (continueDispatcher)
           numDone = DoStuff();
        Thread.Sleep(50);
    }
});
t.Start();

答案 1 :(得分:1)

首先,你应该从不阻止/独占这样的UI线程。找到一些其他方法来管理长期可中断的任务。如果可能的话,使用BackgroundWorker并在另一个线程上完成大部分工作,同时封送回UI线程以报告进度并提交结果(一次一点,或一次全部)。 / p>

另外,如果你想暂停'一个操作,你不应该忙 - 等待一个循环。这将通过屋顶发送您的CPU使用率。通常,您应该使用某种等待句柄将线程发送到等待状态,直到您通知它继续(但从不对UI线程执行此操作)。