C#:连续两次调用方法

时间:2013-03-27 18:54:40

标签: c# multithreading user-interface backgroundworker

这是我的代码。

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();被调用两次 连续。
  • 再次,如果我第三次点击OK按钮, MethodofAnotherThreadThatChangesUIStuff();被召唤三次 连续。
  • 等等。

我希望MethodofAnotherThreadThatChangesUIStuff();只能被调用一次,无论它是哪一次点击。我的意思是,通常情况下应该如何运作。

我在这里缺少什么?

任何帮助都将非常感激。

3 个答案:

答案 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。基本上,您将为每次单击创建一个新工作程序,使用处理程序进行设置,然后运行它。然后,您将丢弃它并为每次点击创建一个新的。