我正在處理在窗體中運行控件,但窗體本身對我沒有任何價值。我基本上希望表單能夠運行一個任務並返回一個值,但是爲了讓我喜歡使用類似於AutoResetEvent的東西,只有在函數調用完成時才從函數調用中返回,這顯然會阻塞表單線程並使其不可能完成任務。在單獨的線程中運行窗體表單
回答
我認爲最簡單的解決方案是,一旦任務完成,只是從形式上引發事件。
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();
}
編輯:當然你要處理的形式,一旦它完成等解開這一事件..
你爲什麼要在窗體中運行任務?
這聽起來像是您的UI和程序邏輯緊密集成。這是糟糕的設計。
一般來說,您可以從工作線程獲取數據的標準方式。 Worker將數據存儲在線程安全的數據結構中,然後向主線程發送一個事件,指示數據可用。
用於網頁抓取目的。 – Novikov 2010-10-21 19:22:45
我有我的兩種念頭:
運行的委託方法
IAsyncResult ar = del.BeginInvoke(callback, state);
...做任務
EndInvoke(ar);
//等待任務結果如果你允許等待單獨的線程
最好的方法可能是使用單獨的線程來完成任務並在此線程中調用委託通知主線程完成工作。
編輯:或像工作者建議我的前任
我爲我的項目做了這個曾經
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);
}
這是如何在單獨的線程上運行'Form'的問題的實際答案。 – Sebastian 2013-09-29 11:30:47
- 1. 在單獨線程中的MFC窗體
- 2. 在單獨的線程中運行VCL
- 3. 運行在單獨的線程
- 4. 在單獨線程上運行ALAssetLibrary塊
- 5. 將每個子窗體作爲MDI容器中的單獨線程運行
- 6. BeginInvoke()是否運行單獨的線程?
- 7. 單獨線程中的多個表單
- 8. 在單獨的窗口運行腳本
- 9. jBPM - 在單獨的線程中運行進程
- 10. 在Qt中運行單獨的進程或線程
- 11. 由一個單獨的線程在窗體上繪製
- 12. 從單獨的線程在窗體上繪製圖像
- 13. 如何使Office 2013窗口在單獨的進程中運行
- 14. Task.Continuewith中的新任務(在單獨的線程上運行)
- 15. 在單獨的線程中運行SimpleXMLRPCServer並關閉
- 16. Google Analytics(分析)是否在單獨的線程中運行?
- 17. 如何在單獨的線程中運行計時器?
- 18. Kivy popup在單獨的線程中運行
- 19. 在單獨的線程中運行Web服務請求
- 20. PyGtk:在單獨的線程中運行gtk.main()循環
- 21. 在單獨的線程中運行成員函數
- 22. 觸發在單獨線程中運行的方法
- 23. SQL觸發器是否在單獨的線程中運行?
- 24. EF嵌套查詢是否在單獨的線程中運行?
- 25. MediaPlayer應該在單獨的線程中運行嗎?
- 26. 如何讓一段代碼在單獨的線程中運行?
- 27. GTK +接口應該在單獨的線程中運行嗎?
- 28. CallBatchTasks(來自ORMLite)是否在單獨的線程中運行?
- 29. 在一個單獨的線程中運行JavaFX控制器
- 30. Swift CoreBluetooth:CentralManager是否應該在單獨的線程中運行?
改爲舉起一個事件。 – 2010-10-21 19:24:31
你有答案嗎? – franklins 2010-10-27 08:33:17