【发布时间】:2011-02-12 02:31:35
【问题描述】:
我有一个用作自动化 UI 的 XAML 应用程序。整个自动化过程可能需要 20-30 小时才能完全执行,因此我创建了一个 Task 类对象,该对象基本上包装了 Thread 方法(开始/停止/重置)。
但是,当我在 Task 对象下运行自动化方法时,XAML UI 很忙,我无法与其他控件交互,包括切换 Thread.Set() 标志的暂停按钮。
还有一个帖子 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 类冲突:msdn.microsoft.com/en-us/library/…
标签: c# multithreading xaml