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();只被调用一次,不管它是哪个点击。我的意思是,一般情况下事情应该是这样的。

我在这里错过了什么?

c#:方法在一行中被调用两次

由于每次按下按钮时都声明在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。从本质上讲,您将为每次单击创建一个新的工作者,使用处理程序对其进行设置,然后运行它。然后,您将丢弃它,并为每次单击创建一个新的。