C#中 多線程執行含有返回值的函數


-------------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的返回結果,有結果返回再保存什么的。問題解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM