这是我的代码。
BackgroundWorker exportWorker = new BackgroundWorker();
private void btnOK_Click(object sender, RoutedEventArgs e)
{
exportWorker.DoWork += new DoWorkEventHandler(ExportWorkerDoWork);
exportWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(ExportWorkerRunWorkerCompleted);
exportWorker.RunWorkerAsync();
}
void ExportWorkerDoWork(object sender, DoWorkEventArgs e)
{
MethodToPerformInThisThread();
**Dispatcher.Invoke(new Action(() => {MethodofAnotherThreadThatChangesUIStuff();}**
}
void ExportWorkerRunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
}
btnOK_Click
)时,它就会消失
提前做好一切就好了。MethodofAnotherThreadThatChangesUIStuff();
被调用两次
连续。MethodofAnotherThreadThatChangesUIStuff();
被召唤三次
连续。我希望MethodofAnotherThreadThatChangesUIStuff();
只能被调用一次,无论它是哪一次点击。我的意思是,通常情况下应该如何运作。
我在这里缺少什么?
任何帮助都将非常感激。
答案 0 :(得分:9)
由于每次按下按钮时都声明背景在Click处理程序之外工作,因此您再次添加事件处理程序。这就是为什么你的方法第二次被调用两次,第三次被调用三次......
要解决此问题,请在click方法之外添加事件处理程序(例如在构造函数中),并在click方法中保留RunAsync()调用。
答案 1 :(得分:3)
每次单击“确定”,您都将创建新的事件处理程序,这些处理程序将调用您的DoWork方法。
将此代码放在应用程序的初始化中:
exportWorker.DoWork += new DoWorkEventHandler(ExportWorkerDoWork);
exportWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(ExportWorkerRunWorkerCompleted);
仅在btnOK_Click
方法中包含以下内容:
exportWorker.RunWorkerAsync();
答案 2 :(得分:2)
这是因为这一行:
exportWorker.DoWork += new DoWorkEventHandler(ExportWorkerDoWork);
正在btnOK_Click
处理程序中运行。如果您在处理程序之外设置事件,请执行以下操作:
BackgroundWorker exportWorker = new BackgroundWorker();
exportWorker.DoWork += new DoWorkEventHandler(ExportWorkerDoWork);
exportWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(ExportWorkerRunWorkerCompleted);
private void btnOK_Click(object sender, RoutedEventArgs e)
{
exportWorker.RunWorkerAsync();
}
然后一切都应该像你期望的那样工作。
另一种选择实际上是在BackgroundWorker
处理程序中创建一个新的btnOK_Click
。基本上,您将为每次单击创建一个新工作程序,使用处理程序进行设置,然后运行它。然后,您将丢弃它并为每次点击创建一个新的。