我正在處理在窗體中運行控件,但窗體本身對我沒有任何價值。我基本上希望表單能夠運行一個任務並返回一個值,但是爲了讓我喜歡使用類似於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. 運行在單獨的線程
- 2. 在單獨線程上運行ALAssetLibrary塊
- 3. BeginInvoke()是否運行單獨的線程?
- 4. 單獨線程中的多個表單
- 5. 在單獨的窗口運行腳本
- 6. 在Qt中運行單獨的進程或線程
- 7. 從單獨的線程在窗體上繪製圖像
- 8. EF嵌套查詢是否在單獨的線程中運行?
- 9. 在單獨的線程中運行計算
- 10. 如何讓一段代碼在單獨的線程中運行?
- 11. 觸發在單獨線程中運行的方法
- 12. 如何在單獨的線程中運行計時器?
- 13. Google Analytics(分析)是否在單獨的線程中運行?
- 14. 異步方法是否在單獨的線程中運行?
- 15. 在Android服務的單獨線程中運行位置更新
- 16. PyGtk:在單獨的線程中運行gtk.main()循環
- 17. Swift CoreBluetooth:CentralManager是否應該在單獨的線程中運行?
- 18. java代理是否在單獨的線程中運行?
- 19. 在單獨的線程中運行SimpleXMLRPCServer並關閉
- 20. 如何在單獨的線程中運行方法
- 21. MediaPlayer應該在單獨的線程中運行嗎?
- 22. SQL觸發器是否在單獨的線程中運行?
- 23. pyqt多線程 - 無法同時運行單獨的線程?
- 24. 「在單獨的線程中運行實例」的最簡單方法是什麼?
- 25. 在窗口關閉時運行窗體窗體線程
- 26. 方法在單獨的線程中運行 - 如何調用線程
- 27. 在單獨的線程上運行的android服務
- 28. 在dotnet窗體窗體中,如何暫停表單而不將表單的線程休眠?
- 29. 如何在單獨的線程上運行服務?
- 30. 如何在單獨的線程上運行NamedPipeServerStream.WaitForConnection()?
改爲舉起一個事件。 – 2010-10-21 19:24:31
你有答案嗎? – franklins 2010-10-27 08:33:17