簡體   English   中英

WinForm 應用程序 UI 在長時間運行期間掛起

[英]WinForm Application UI Hangs during Long-Running Operation

我有一個 Windows 窗體應用程序,我需要在該應用程序上使用一個 for 循環,該循環具有大約 2000 到 3000 個調用的大量遠程調用,

在執行for循環時,我失去了對表單和表單控件的控制,因為它變成了一個大進程,有時它顯示“沒有響應”,但如果我等待很長時間它又回來了,我想我需要使用一些線程模型,有什么想法,我該如何解決這個問題?

您需要在后台線程上執行長時間運行的操作。

有幾種方法可以做到這一點。

  1. 您可以將方法調用排隊以在線程池線程上執行(請參見此處):

     ThreadPool.QueueUserWorkItem(new WaitCallback(YourMethod));

    在 .NET 4.0 中,您可以使用TaskFactory

     Task.Factory.StartNew(() => YourMethod());

    在 .NET 4.5 及更高版本中,您可以(並且應該,而不是TaskFactory.StartNew() )使用Task.Run()

     Task.Run(() => YourMethod());
  2. 如果您需要進度更新或完成時的通知等內容,您可以使用BackgroundWorker對該方法進行更多控制。 將 BackgroundWorker 控件拖到表單上,並將您的方法附加到 dowork 事件。 然后在您想運行您的方法時啟動工作程序。 您當然可以從代碼中手動創建 BackgroundWorker,只要記住它需要在您完成后處理。

  3. 為您的工作創建一個全新的線程。 這是最復雜的並且沒有必要,除非您需要對線程進行真正細粒度的控制。 如果您想了解這一點,請參閱Thread類的 MSDN 頁面。

請記住,對於任何線程,您都無法更新 GUI,或從后台線程更改任何 GUI 控件。 如果您想在 GUI 上做任何事情,您必須使用 Invoke(和 InvokeRequired)在 GUI 線程上觸發該方法。 這里

    private voidForm_Load(object sender, EventArgs e)
    {
        MethodInvoker mk = delegate
        {
            //your job
        };
        mk.BeginInvoke(callbackfunction, null);
    }

    private void callbackfunction(IAsyncResult res)
    {
        // it will be called when your job finishes.
    }

使用 MethodInvoker 是最簡單的方法。

顯然,您需要使用后台線程。 我建議你閱讀這本免費的電子書

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM