簡體   English   中英

如何在C#中將應用程序編寫為多線程應用程序?

[英]How can I write my application as a multithreaded application in C#?

我有一個執行許多任務的C#Windows應用程序。 其中一些任務非常浪費時間。 當我運行這些類型的任務時,我的應用程序的其他部分將被禁用。

如何編寫應用程序以避免這種情況? 使用線程是一個好的解決方案嗎? 安全嗎?

您可以嘗試的第一件事是使用BackgroundWorker

您可能需要花費大量時間才能運行此方法: void HeavyLifting()

因此,使用BackgroundWorker委派一些工作!

var worker = new BackgroundWorker();

worker.DoWork += new DoWorkEventHandler(someHeavyWork);

在這種情況下,someHeavyWork事件方法僅調用HeavyLifting。

要啟動工作人員,只需執行以下操作:

worker.RunWorkAsync();

提示:更新GUI線程

請記住,如果要通過該線程在GUI線程中進行更改,則需要為此使用invoke / delegates。 您可以在MSDN上閱讀有關此內容的信息: 如何從未創建用戶界面的線程更新用戶界面?

一個很好的在線資源,用於理解.NET中的線程,其中包含許多示例; 由約瑟夫·阿爾巴哈里(Joseph Albahari)分享。

您已經要求后台工作人員提出建議。 另一種方法是自己啟動一個新線程。

void main()
{
   Thread worker = new Thread(new ThreadStart(DoStuff));
   worker.Start();
}

private void DoStuff() 
{
  // long running work in here
}

如果要向DoStuff()方法中添加參數,也可以使用ParameterizedThreadStart

當前,您可以使用ThreadPool在不是Windows Forms Applications的程序中將后台任務排隊。 在.NET 4.0中,有許多用於並行編程的新功能(例如Parallel LINQ等)。 並行編程的模式:了解和應用.NET Framework 4的並行模式可能對您很有趣。

干杯馬提亞

或者,如果您使用.net 4.0,則可以使用任務框架,這很好。 但是請注意不要從另一個線程寫入UI控件。

如前所述,使用BackgroundWorker並查看此答案此答案

嘗試使用BackgroundWorker

創建一個BackGroundWorker(在工具箱中可用)

創建DoWork事件(您可以在BGW屬性的事件選項卡中訪問此事件)

    private void BGWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        DoTimeConsumingTask();
    }

並使用以下命令調用它:

BGWorker.RunWorkerAsync();

您可以將變量傳遞給DoWork處理程序,可以通過訪問該變量

e.Argument //(It comes as an Object, you can use int.Parse, .ToString() or whatever

暫無
暫無

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

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