C#主線程等待子線程運行結束


佐左佑右 原文 C#主線程等待子線程運行結束

  由於主程序中調用matlab的dll文件進行計算要用較長的時間,主界面會有很長時間的卡頓,造成的用戶感受十分不好,因此我想在調用時,將調用放入子線程中,然后在主線程中彈出一個提示框,顯示數據正在加載,等子線程運行結束后,主線程繼續工作。

    使用的是http://hi.baidu.com/oktell/item/5527f51d93abb4a5feded5a8中所提到的方法,用了這篇文章中的第一個方式,即不帶參數的。
    之后在其中加入了顯示和關閉提示框的代碼,最終完成。代碼如下:
using System.Threading;
namespace ThreadStudy { class StopAllWaitBySubThread { List manualEvents = new List(); public void Main() { ManualResetEvent mre = new ManualResetEvent(false); manualEvents.Add(mre); ThreadPool.QueueUserWorkItem(ThreadMethod, mre); Form f = Application.OpenForms["Form_CreateObject"];//查找是否打開過窗體 if (f == null) //沒打開過 ,打開 { Form_CreateObject datamanage = new Form_CreateObject(); datamanage.Show(); } else { f.Focus(); //打開過就讓其獲得焦點 } WaitHandle.WaitAll(manualEvents.ToArray());//程序會在此處暫停,等待子線程運行結束。 f = Application.OpenForms["Form_CreateObject"];//查找是否打開過窗體 if (f == null) //沒打開過 {
}
else { f.Close(); //打開過就關掉 } } private void ThreadMethod(object obj) { //耗時的函數,處理事情,Matlab Matlab(); ManualResetEvent mre = (ManualResetEvent)obj; mre.Set(); Console.WriteLine("Thread execute"); } } }

 

    經過試用后發現,UI中的等待gif還是會卡住。事實上,上述方法相當於是將主線程阻塞了,因此提示框卡住就難以避免。同時,我還發現,使用多線程后,得出結果的速度更快了,效率上有着一定的提高。


免責聲明!

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



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