我有一个标有" Check"的按钮。在后台工人区块中执行长时间运行检查:
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
runCheck();
};
现在,当支票运行时,我禁用了按钮:
CheckButton.IsEnabled = false;
但我想做的是转过"检查"按钮进入"取消"它正在执行的.DoWork任务按钮,因此用户可以根据需要取消。然后一旦取消,按钮将恢复到原来的状态" Check"形成。这可能吗?
答案 0 :(得分:1)
我得到的印象是你有两个问题:如何将按钮更改为取消按钮,以及如何使用该按钮实际取消任务。更改按钮以显示“取消”非常简单,可以使用
完成CheckButton.Content = "Cancel";
如果你想从一个单独的线程(比如后台工作者)更改按钮的Content
,那么你需要使用它的调度程序来处理这个
CheckButton.Dispatcher.BeginInvoke(() => {CheckButton.Content = "Cancel";});
至于实际取消长时间运行的任务,您需要在任务本身中设置一个特定的机制,为您提供一种明确停止它的方法。您可以在线程上设置它,手动中止线程,但这是一个糟糕的坏主意。如果它是重复活动,如循环或长时间操作,您可以检查bool
public bool CancelTask = false;
在点击活动中,您可以:
if (CheckButton.Content.ToString() == "Check")
{
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
runCheck();
};
CheckButton.Content = "Cancel";
}
else
{
CancelTask = true;
//Some code to wait for the task to finish canceling, then set CancelTask back to false
CheckButton.Content = "Check";
}
然后在你的任务中你需要像
这样的东西if (CancelTask) return; //Or something to stop the task early
答案 1 :(得分:0)
我只是担心你会遇到一个交叉线程场景,仔细看看一些方法& BackgroundWorker类提供的事件我已经成功使用了ReportProgress方法