-------------2017-06-09 更新-----------------------------------
如果你想不阻塞主線程地執行某個任務,並想在該任務結束時把結果顯示在界面上,可以使用:
方法1:使用binding,在線程中改變結果值時手動notify。
方法2:使用ContinueWith
方法3:使用await、async
以下方法是個人的土辦法,已經過時了。。
=================================================================================================================
C# 中,傳統的多線程並不支持多線程執行含有返回結果的函數。雖然可以通過制作外殼類來使得返回結果得以保留,但如果一定時間內函數未執行完,簡單的外殼類可能就無法滿足需求了。
class netHelper { public static string sendResult = ""; public void yourFunction(Object obj) { Thread.Sleep(10000); sendResult = "the result after excuted"; } }
如此一來,只要我們先多線程調用yourFunction,就可以在sendResult里獲得結果。
那么問題來了,如過實際的函數像我上面寫的一樣,含有一個非常耗時間的操作,那么我們用來存儲執行結果的變量可能就還沒來得及被賦值,而什么時候能得到返回結果、有返回結果之后如何獲得,也是個問題。
第二個是使用Task。
Task<string> yourTask = new Task<string>(()=>{Thread.Sleep(10000); MessageBox.Show("afterthis i go");} ); yourTask.Start(); string result = yourTask.result;
Task內部雖然保證了result只有在有結果的時候才會被賦值,但是同樣,如果這個函數的執行時間非常長,你又在父級里調用了yourTask.Result,那么task就相當於阻塞運行;如果父進程是個ui進程,ui還會卡死。
解決方案是,新建一個線程,專門等待Task的返回結果,有結果返回再保存什么的。問題解決。