2010-10-21 81 views
1

我正在處理在窗體中運行控件,但窗體本身對我沒有任何價值。我基本上希望表單能夠運行一個任務並返回一個值,但是爲了讓我喜歡使用類似於AutoResetEvent的東西,只有在函數調用完成時才從函數調用中返回,這顯然會阻塞表單線程並使其不可能完成任務。在單獨的線程中運行窗體表單

+0

改爲舉起一個事件。 – 2010-10-21 19:24:31

+0

你有答案嗎? – franklins 2010-10-27 08:33:17

回答

2

我認爲最簡單的解決方案是,一旦任務完成,只是從形式上引發事件。

void RunTask() 
{ 
    Form form = new Form(); 
    form.TaskCompleted += new EventHandler(form_TaskCompleted); 
    form.Show(); 
} 

void form_TaskCompleted(object sender, EventArgs e) 
{ 
    object result = ((Form)sender).GetResult(); 
} 

編輯:當然你要處理的形式,一旦它完成等解開這一事件..

2

你爲什麼要在窗體中運行任務?

這聽起來像是您的UI和程序邏輯緊密集成。這是糟糕的設計。

一般來說,您可以從工作線程獲取數據的標準方式。 Worker將數據存儲在線程安全的數據結構中,然後向主線程發送一個事件,指示數據可用。

+0

用於網頁抓取目的。 – Novikov 2010-10-21 19:22:45

2

我有我的兩種念頭:

  1. 運行的委託方法

    IAsyncResult ar = del.BeginInvoke(callback, state);

    ...做任務

    EndInvoke(ar); //等待任務結果如果你允許等待

  2. 單獨的線程

最好的方法可能是使用單獨的線程來完成任務並在此線程中調用委託通知主線程完成工作。

編輯:或像工作者建議我的前任

8

我爲我的項目做了這個曾經

var frmNewForm = new Form1(); 
var newThread = new System.Threading.Thread(frmNewFormThread); 

newThread.SetApartmentState(System.Threading.ApartmentState.STA); 
newThread.Start(); 

並添加遵循方法。你的newThread.Start會調用這個方法。

public void frmNewFormThread() 
{ 
    Application.Run(frmNewForm); 
} 
+1

這是如何在單獨的線程上運行'Form'的問題的實際答案。 – Sebastian 2013-09-29 11:30:47

相關問題