2

这是我的代码。

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) 时,它会继续运行一切正常。
  • 现在,如果我在代码执行完成后第二次单击“确定”按钮,粗体中的代码会运行两次,这意味着该方法MethodofAnotherThreadThatChangesUIStuff();会连续调用两次。
  • 同样,如果我第三次单击“确定”按钮, MethodofAnotherThreadThatChangesUIStuff();则会连续调用 3 次。
  • 等等。

我希望MethodofAnotherThreadThatChangesUIStuff();只调用一次,无论它是哪个点击。我的意思是,一般来说事情应该是这样的。

我在这里想念什么?

任何帮助将不胜感激。

4

3 回答 3

9

由于您每次按下按钮时都声明背景在 Click 处理程序之外工作,因此您再次添加事件处理程序。这就是为什么您的方法第二次被调用两次而第三次将被调用三次的原因......

要解决这个问题,请在 click 方法之外添加事件处理程序(例如在构造函数中),并且只在 click 方法中保留 RunAsync() 调用。

于 2013-03-27T18:57:24.217 回答
3

每次单击“确定”时,您都在创建新的事件处理程序,它们都将调用您的 DoWork 方法。

将此代码放在应用程序的初始化中:

exportWorker.DoWork += new DoWorkEventHandler(ExportWorkerDoWork);
exportWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(ExportWorkerRunWorkerCompleted);

btnOK_Click在您的方法中仅包含以下内容:

exportWorker.RunWorkerAsync();
于 2013-03-27T19:00:11.587 回答
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();
}

那么一切都应该像你期望的那样工作。

另一种选择实际上是BackgroundWorkerbtnOK_Click处理程序中创建一个新的。本质上,您将为每次点击创建一个新的工作人员,使用处理程序对其进行设置,然后运行它。然后,您将丢弃它并为每次点击创建一个新的。

于 2013-03-27T19:01:41.610 回答