0

と の 2 つのフォームがあるMainFormとしWaitingFormます。MainFormからをWaitingFormメソッドに渡し、 を使用してバックグラウンドで実行したいと考えていBackgroundWorkerます。

今、私はそのようにやっています:

MainForm.cs:

public partial class MainForm: Form
{
    private void btnImport_Click(object sender, EventArgs e)
    {
        var waitingFrm = new WaitingForm();
        waitingFrm.DoWork = (o, args) => this.LongRunningOperation(this, new DoWorkEventArgs("foo bar"));
        waitingFrm.OnWorkCompleted = (o, args) => MessageBox.Show("Finished!");
        waitingFrm.Show();
        waitingFrm.Run(); // should execute LongRunningOperation, method below.
    }

    private void LongRunningOperation(object sender, DoWorkEventArgs e)
    {
        MessageBox.Show("Running long operation!....");
        // some long running stuff here;
    }
}

WaitingForm.cs

public partial class WaitingForm: Form
{
    private BackgroundWorker worker = new BackgroundWorker();
    public DoWorkEventHandler DoWork { get; set; }
    public RunWorkerCompletedEventHandler OnWorkCompleted { get; set; }

    public WaitingForm()
    {
        this.worker.DoWork += DoWork;
        this.worker.RunWorkerCompleted += OnWorkCompleted;
        InitializeComponent();
    }

    public void Run()
    {
        this.worker.RunWorkerAsync();
    }
}

しかし、waitingFrm.Run();私の後LongRunningOperationは実行されません。

4

4 に答える 4

1

だから、簡単な答えはそれです。メインフォームがBackgroundWorkerオブジェクト インスタンス イベントを認識していないため、コードが機能していません。代わりに:

    this.worker.DoWork += DoWork;
    this.worker.RunWorkerCompleted += OnWorkCompleted;

WaitingForm - InitializeComponent() では、次のように mainForm で代わりにこれを行います。

    waitingFrm.worker.DoWork += waitingFrm.DoWork;
    waitingFrm.worker.RunWorkerCompleted += waitingFrm.OnWorkCompleted;
于 2012-04-07T14:43:30.287 に答える
1

あなたの WaitingForm では、次のようにします。

public event DoWorkEventHandler DoWork {
    add { worker.DoWork += value; } 
    remove { worker.DoWork += value; }
}

(get;set; プロパティの代わりに)。そして、メイン ウィンドウbtnImport_Clickハンドラーで 次のようにします。

waitingFrm.DoWork += LongRunnignOperation;

完成したハンドラーについても同じです。構文が複雑すぎるようです。これは、イベント (この場合は待機中のフォーム) を公開し、イベント ハンドラーを実際のハンドラー (この場合は worker.DoWork) に渡す単純な方法です。と同等です

 waitingFrm.worker.DoWork += LongRunnignOperation;

これも同様です。

于 2012-04-07T13:53:52.267 に答える
1

MainForm から WaitingForm に、BackgroundWorker を使用してバックグラウンドで実行するメソッドを渡したい

私はこの場合

  • でイベントを宣言するWaitingForm
  • Form1ショーの前WaitingFormにそのイベントにサブスクライブします
  • 長時間実行される操作を実行する必要がWaitingFormある場合、イベントを発生させ、Form1それを取得し、 Form1そのメソッドを他のスレッドで実行します。

お役に立てれば。

于 2012-04-07T13:56:34.073 に答える
1

この特定のケースでは、すべての作業を実行する必要があり、それはユーザーへの単なる表示のMainFormように見えます。WaitingFormその場合は、を入れてBackgroundWorkerMainFormイベントを使用して呼び出すだけですWaitingForm

public partial class MainForm: Form
{
  private void btnImport_Click(object sender, EventArgs e) {
    var waitingForm = new WaitingForm();
    waitingForm.Show();
    var worker = new BackgroundWorker();
    worker.DoWork += (o, args) => this.LogRunningOperation(o, args);
    worker.OnWorkComplete += (o, args) => {
      waitingForm.Close();
      worker.Dispose();
    };
    worker.RunWorkerAsync();
  }

  private void LongRunningOperation(object sender, DoWorkEventArgs e) {
    MessageBox.Show("Running long operation!....");
    // some long running stuff here;
  }
}
于 2012-04-07T13:58:59.723 に答える