자동화를위한 UI 역할을하는 XAML 응용 프로그램이 있습니다. 전체 자동화는 20-30 시간에서 완전히 실행될 수 있으므로 기본적으로 스레드 메소드 (시작/중지/재설정)를 래핑하는 Task 클래스 객체를 만들었습니다.WPF/XAML : 스레드 된 프로세스를 실행하고 주 UI가 사용 중이거나 고정되지 않게하려면 어떻게해야합니까?
그러나 Task 개체 아래에서 자동화 메서드를 실행하면 XAML UI가 사용 중이므로 Thread.Set() 플래그를 토글하는 Pause 단추를 비롯한 다른 컨트롤과 상호 작용할 수 없습니다.
사람이 MSDN 기사는 내 상태의 수를 표시하기위한 목적으로 수행하는 UI에서 오브젝트를 조작하는 경우 때 사용하는 것은 좋지 않다 가지 설명 BackgroundWorker 구성 클래스를 권장 또 다른 포스트 Prevent UI from freezing without additional threads
있다 : http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
이 주변의 아이디어? 누군가가이 MSDN의 문서를 가지 설명 BackgroundWorker 구성 클래스를 추천
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 –