c#:方法在一行中被调用两次
本文关键字:调用 两次 一行 方法 | 更新日期: 2023-09-27 18:06:04
这是我的代码。
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)
{
}
- 当我第一次点击OK按钮(
btnOK_Click
)时,它去了 - 现在,如果我点击OK按钮后的代码第二次完成执行后,粗体中的代码运行两次,这意味着方法
MethodofAnotherThreadThatChangesUIStuff();
被调用两次 再次,如果我第三次点击OK按钮, - 等等
MethodofAnotherThreadThatChangesUIStuff();
被调用三次我希望MethodofAnotherThreadThatChangesUIStuff();
只被调用一次,不管它是哪个点击。我的意思是,一般情况下事情应该是这样的。
我在这里错过了什么?
由于每次按下按钮时都声明在Click处理程序之外工作的背景,因此再次添加事件处理程序。这就是为什么第二次调用你的方法两次,第三次调用它三次…
要解决这个问题,请在click方法之外添加事件处理程序(例如在构造函数中),并且只在click方法中保留RunAsync()调用。
每次单击OK时,您都在创建新的事件处理程序,这些处理程序将调用您的DoWork方法。
将以下代码放在应用程序的初始化中:
exportWorker.DoWork += new DoWorkEventHandler(ExportWorkerDoWork);
exportWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(ExportWorkerRunWorkerCompleted);
只包含以下btnOK_Click
方法:
exportWorker.RunWorkerAsync();
这是因为这一行:
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();
}
那么一切都应该像你期望的那样工作。
另一个选项实际上是在btnOK_Click
处理程序中创建一个新的BackgroundWorker
。从本质上讲,您将为每次单击创建一个新的工作者,使用处理程序对其进行设置,然后运行它。然后,您将丢弃它,并为每次单击创建一个新的。