我有一个XAML应用程序,用作自动化的UI。整个自动化可能需要20-30小时的时间才能完全执行,因此我创建了一个基本上包装线程方法(启动/停止/重置)的任务类对象。WPF/XAML:如何执行线程进程并防止主UI忙/冻结?
但是,当我在Task对象下运行自动化方法时,XAML UI很忙,我无法与其他控件交互,包括切换Thread.Set()标志的Pause按钮。
还有另一篇文章 Prevent UI from freezing without additional threads
,其中有人推荐BackgroundWorker的类此MSDN文章提到这是一个坏主意,用这个,如果它操纵的UI,这矿的确显示状态,计数的目的,对象时: http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
解决这个任何想法?
private void OnButtonStartAutomationClick(object sender, RoutedEventArgs e)
{
btnPauseAutomation.IsEnabled = true;
Automation.Task AutomationThread = new Automation.Task(RunFullAutomation);
}
private void RunFullAutomation()
{
// do stuff that can take 20+ hours
// threaded so I can utilize a pause button (block)
}
class Task
{
private ManualResetEvent _shutdownFlag = new ManualResetEvent(false);
private ManualResetEvent _pauseFlag = new ManualResetEvent(true);
private Thread _thread;
private readonly Action _action;
public Task(Action action)
{
_action = action;
}
public void Start()
{
ThreadStart ts = new ThreadStart(DoDelegatedMethod);
_thread = new Thread(ts);
_thread.Start();
_thread.Priority = ThreadPriority.Lowest;
}
public void Resume()
{
_pauseFlag.Set();
}
public void Stop()
{
_shutdownFlag.Set();
_pauseFlag.Set();
_thread.Join();
}
private void DoDelegatedMethod()
{
do
{
_action();
}
while (!_shutdownFlag.WaitOne(0));
}
}
请注意 - 我建议不要创建一个名为Task的类,因为它与框架的Task类冲突:http://msdn.microsoft.com/en-us/library/system.threading。 tasks.task.aspx – 2011-02-12 02:37:19