我有一个绑定到集合的列表视图。
使用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;
}
答案 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线程执行此操作)。