[英]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(在工具箱中可用)
創建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.