Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对BackgroundWorker事件不触发感到困惑_C#_.net_Winforms_Backgroundworker - Fatal编程技术网

C# 对BackgroundWorker事件不触发感到困惑

C# 对BackgroundWorker事件不触发感到困惑,c#,.net,winforms,backgroundworker,C#,.net,Winforms,Backgroundworker,这似乎是一个有点做作的例子,但让我挠头 好的,我有一个控制台应用程序,它实例化一个WindowsForm,并在窗体上调用一个名为DoSomeWork()的方法 class Program { static void Main(string[] args) { Form1 form = new Form1(); form.DoSomeWork(); } } 表格1看起来像这样 public partial clas

这似乎是一个有点做作的例子,但让我挠头

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

class Program
  { 
    static void Main(string[] args)
    {
      Form1 form = new Form1();         
      form.DoSomeWork();   
    }
  }
表格1看起来像这样

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();
    }
  }
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();
    }
  }
外部类,反过来,看起来像这样

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();
    }
  }
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();
    }
  }
最后,内部类看起来像这样

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();
    }
  }
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();

在课堂教学中,效果很好。那么,当我通过表单调用相同的方法时,为什么我的事件不会触发呢

谢谢


编辑:我将ProgressChanged事件处理程序保留为抛出NotImplementedException,这似乎是在吓人,因此为了清楚起见,我将其删除。

您是否真的
抛出NotImplementedException()在处理程序中?或者你只是很快地模拟了一下,却忘了把它移除

我的猜测是,这与正在使用的不同线程单元模型有关

根据我的经验,如果一个单线程单元非UI线程在主UI线程之外抛出一个异常,该线程将在没有任何警告的情况下死亡

如果我没记错的话,Windows窗体需要与控制台应用程序不同的单元模型。这可能是问题的根源


我可能错了,但这应该会给出一些提示。

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

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

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

是的,我在模拟应用程序,这就是为什么我在其中保留NotImplementedException。在任何情况下,它都不会被抛出,因为ProgressChanged事件从不激发。但你至少给了我一些可以一起工作的东西…谢谢!啊,但是你怎么知道ProgressChanged事件从不触发呢?他的观点是NotImplementedException可能会被抛出,但会被忽略。添加调试。打印在那里,看看你是否看到了。哦,我现在明白了…我添加了调试代码,但仍然没有骰子。我需要阅读有关在Windows窗体应用程序中使用后台线程的内容,最后:)谢谢。这就是问题所在。非常感谢!