2012-04-07 20 views
0

假設我們有兩個表單:MainFormWaitingForm。我想從MainForm傳遞給WaitingForm使用BackgroundWorker在後臺運行的方法。現在在第二個表單上使用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

+1

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

在WaitingForm的InitializeComponent(),這樣做,而不是在MainForm的這樣嗎? – R0MANARMY 2012-04-07 13:43:30

+0

Becaues我想重用WaitingForm以便在後臺運行其他的東西。 – Dariusz 2012-04-07 13:45:24

+0

WaitingForm - Windows服務? – 2012-04-07 13:49:06

回答

1

在你WaitingForm我會怎麼做:

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

(不是GET的;設置;屬性)。 ,然後在主窗口btnImport_Click處理程序只是:

waitingFrm.DoWork += LongRunnignOperation; 

與同爲完成處理程序。你的語法似乎過於複雜。這只是一個乾淨的方式來暴露一個事件(在這種情況下在你的等待形式)和通過事件處理程序通過真正的處理程序(在這種情況下worker.DoWork)。它相當於

waitingFrm.worker.DoWork += LongRunnignOperation; 

這樣做也是一樣。

+0

不錯,但不應該是公共事件DoWorkEventHandler DoWork {.. – Dariusz 2012-04-07 14:03:30

+0

是的 - 謝謝 - 修正。 – Ricibob 2012-04-07 14:04:50

1

我想通過,從MainForm中,到WaitingForm方法在這種情況下使用的BackgroundWorker

我會運行在後臺

  • WaitingForm
  • 聲明一個事件
  • Form1之前顯示WaitingForm訂閱該事件
  • 長時間運行必須運行WaitingForm引發事件,Form1得到它並且 Form1Form1在其他線程中運行它的方法。

希望這會有所幫助。

1

在這種特殊情況下,您希望所有工作都在MainForm發生,看起來WaitingForm只是用戶的顯示屏。如果是這樣的話,那麼我只想把在MainFormBackgroundWorker和使用事件調入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; 
    } 
} 
+0

要麼你錯過了大括號,要麼C#在函數內部聲明函數的功能=)。 – R0MANARMY 2012-04-07 14:16:00

+0

@ R0MANARMY哎呀,修正:) – JaredPar 2012-04-07 14:16:46

+0

是的,但現在btnImport過程控制:1)創建WaitingForm 2)創建BackgroundWorker,並將其連接成一個。有點凌亂恕我直言。 – Dariusz 2012-04-07 16:41:19

1

所以,簡單的答案是。您的代碼不起作用,因爲mainform不是看到 BackgroundWorker對象實例事件。而不是做的 - :爲什麼你需要的後臺工作是一個形式

waitingFrm.worker.DoWork += waitingFrm.DoWork; 
    waitingFrm.worker.RunWorkerCompleted += waitingFrm.OnWorkCompleted; 
+0

我不想讓我的工作人員公開,我認爲最好隱藏這一點。 – Dariusz 2012-04-07 16:37:06

+0

重要的是你理解了問題並解決了問題......如果你想使用這種方法,你可以使它成爲內部的。這是一個選擇的問題。 – 2012-04-07 19:04:55

相關問題