Pergunta

Isto pode parecer como um exemplo um pouco artificial, mas eu estou à esquerda coçar a cabeça.

Ok, eu tenho um aplicativo console que instancia um WindowsForm e chama um método chamado DoSomeWork () no formulário.

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

Form1 fica assim ...

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

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

classe externa, por sua vez, se parece com isso ...

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

E, finalmente InnerClass olhares como este ...

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

Para uma razão desconhecida (para mim), o BacgroundWorker em InnerClass nunca parece disparar a ProgressChanged evento. Se eu substituir

Form1 form = new Form1();

com

OuterClass outerClass = new OuterClass()

na classe Program, ele funciona bem. Então, por que é que os meus eventos não são acionados quando eu estou chamando os mesmos métodos através de um formulário?

Obrigado!

EDIT:. Eu parecia estar jogando as pessoas fora, deixando o manipulador de eventos ProgressChanged como jogando um NotImplementedException, para que eu tenha removido para maior clareza

Foi útil?

Solução

Você esqueceu de iniciar um ciclo de mensagem, chamando Application.Run () é necessária. Sem um ciclo de mensagem, os eventos BackgroundWorker não pode trabalhar. Para corrigir:

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

Chamada DoSomeWork () no construtor do formulário ou do evento Load.

Outras dicas

Você realmente throw NotImplementedException(); no manipulador? ou você está apenas zombando isso rápido e esqueceu-se de removê-lo?

Meu palpite seria que ela está relacionada a diferentes modelos de apartamentos thread que está sendo utilizado.

Da minha experiência, se um single-thread-apartamento não-UI fio lança um fora excepção do grande segmento interface do usuário, esse segmento será simplesmente morre sem qualquer aviso.

Windows Forms requerem um modelo de apartamento diferente do que aplicações do console, se bem me lembro. Isso poderia ser a fonte do problema.

Eu posso estar errado, mas que deve dar algumas indicações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top