c# - 对未触发的 BackgroundWorker 事件感到困惑

标签 c# .net winforms backgroundworker

这似乎是一个有点人为的例子,但我还是摸不着头脑。

好的,我有一个控制台应用程序,它实例化一个 WindowsForm 并在该窗体上调用一个名为 DoSomeWork() 的方法。

class Program
  { 
    static void Main(string[] args)
    {
      Form1 form = new Form1();         
      form.DoSomeWork();   
    }
  }

Form1 看起来像这样......

public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    public void DoSomeWork()
    {
      OuterClass outerClass = new OuterClass();
      outerClass.DoSomeWork();
    }    
  }

反过来,外部类看起来像这样......

public class OuterClass
  {
    public void DoSomeWork()
    {
      InnerClass innerClass = new InnerClass();
      innerClass.DoSomeWork();
    }
  }

最后 InnerClass 看起来像这样......

public class InnerClass
  {
    private BackgroundWorker _backgroundWorker = new BackgroundWorker();

    public InnerClass()
    {
      _backgroundWorker.WorkerReportsProgress = true;
      _backgroundWorker.DoWork += new DoWorkEventHandler(BackgroundWorker_DoWork);
      _backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(BackgroundWorker_ProgressChanged);
    }

    void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
      int i = 0; //I've placed a break point here. But it's never hit
    }

    void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
      BackgroundWorker worker = sender as BackgroundWorker;

      worker.ReportProgress(42);
    }

    public void DoSomeWork()
    {
      _backgroundWorker.RunWorkerAsync();
    }
  }

出于(对我而言)未知的原因,InnerClass 中的 BacgroundWorker 似乎从未触发 ProgressChanged 事件。如果我更换

Form1 form = new Form1();

OuterClass outerClass = new OuterClass()

在类程序中,它工作正常。那么,当我通过表单调用相同的方法时,为什么我的事件没有触发?

谢谢!

编辑:我似乎通过将 ProgressChanged 事件处理程序保留为抛出 NotImplementedException 而让人们失望,因此为了清楚起见,我将其删除。

最佳答案

您忘记启动消息循环,需要调用 Application.Run()。没有消息循环,BackgroundWorker 事件就无法工作。修复:

static void Main(string[] args)
{
  Application.Run(new Form1());   
}

在窗体的构造函数或其加载事件中调用 DoSomeWork()。

关于c# - 对未触发的 BackgroundWorker 事件感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/231886/

相关文章:

.net - 注入(inject)/处理属性 getter / setter ?

c# - MVVM Light - 多个 ViewModel(并将它们连接起来)

c# - 强制 BindingList 排序

c# - 如何在 MVC 3 中将 WebForms .ascx 显示为局部 View

c# - INotifyPropertyChanged - 事件保持为空

.net - 更改表单不透明度而不更改容器控件的不透明度

c# - 让计时器执行 bidder00_TextChanged 事件

c# - 添加时在窗体中查找UserControl

c# - 可以采取哪些步骤来优化 ListView

c# - 从 Xamarin.iOS 中的 { alpha, red, green, blue } 值创建 CGColor