2013-05-02 112 views
2

我希望知道在哪裏可以獲得多線程或異步線程的示例。異步線程

在我忙於應用程序中,我必須在應用程序的後臺運行一個線程來獲取正在更改的值。每當這個值達到一定數量時,它就需要調用另一個函數。所有這些都必須在程序的後臺運行,以便用戶仍然可以在應用程序上執行其他操作。

任何可能會有所幫助的示例或鏈接都將得到真正的讚賞。

+2

http://www.albahari.com/threading/ – metadings 2013-05-02 07:03:46

+0

後臺工作人員? http://msdn.microsoft。com/en-us/library/system.componentmodel.backgroundworker.aspx – NDJ 2013-05-02 07:05:46

+0

異步*和*線程?你真的不知道你的代碼何時會運行,不是嗎。 :) – cHao 2013-05-02 07:22:04

回答

1

那麼取決於你尋求的控制級別BackgroundWorker可以很容易地工作,它發現在System.ComponentModel.BackgroundWorker內。現在,這裏是MSDN文檔的鏈接主題:http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

一個簡單的用例secenario是像這樣:

BackgrouWorker BG = new BackgroudWorker(); 
GB.DoWork += YourFunctionDelegate(object Sender, EventArgs e); 
GB.RunWorkerAsync(); 

現在YourFunctionDelegate(object Sender,EventArgs e)應該是什麼都想要在後臺運行。然而,需要遵循這個參數形式,還有很多輔助函數與背景工作相關,如onProgressChanged事件,它允許監視顯然的進度,如果你是新手的線程,如果你嘗試做你自己的線程。

如果您想要更多的控制執行以及線程的功能,您應該看看這裏的任務 - 並行庫:http://msdn.microsoft.com/en-us/library/dd460717.aspx其中有大量有關多線程的信息。

而且這裏是如何創建一個C#線程偉大的教程:在.NET 4.5 http://support.microsoft.com/default.aspx?scid=kb;en-us;815804

1

對於異步編程在Windows 8的概述:

http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

對於.NET 4.0和更舊的,你可以使用ThreadPool

System.Threading.ThreadPool.QueueUserWorkItem(obj => 
    { 
     // Do some work 
     for (int i = 0; i < 1000; i++) 
      Math.Sin(i); 

     // Get back to the UI thread 
     App.Current.MainWindow.Dispatcher.BeginInvoke(
      new Action(delegate 
      { 
       block.Text = "Done!"; 
      })); 
    }); 
+0

對於.net 4,TPL和它的任務是實現並行性的首選方式http ://msdn.microsoft.com/en-us/library/dd460717(v = vs.100).aspx – 2013-05-02 08:20:18

2

爲了總結選項,我會嘗試在這裏列出它們(mayb e將它作爲社區wiki是個好主意)。

首先,你可以簡單地在另一個thread啓動功能:

Thread t = new Thread(ThreadProc); 
t.Start(); 
// now you can wait for thread to finish with t.Join() or just continue 
// Thread.IsBackground allows to control how thread lifetime influences 
// the lifetime of the application 

... 
static void ThreadProc() {...} // can also be non-static, but for simplicity.... 

然後你可以使用BackgroundWorker

BackgroundWorker bgWorker = new BackgroundWorker(); 
bgWorker.DoWork += MyFunction; 
bgWorker.RunWorkerAsync(); 

voud MyFunction(object o, DoWorkEventArgs args) {...} 

您可以使用ProgressChangedRunWorkerCompleted事件進行更多的控制(如以及WorkerReportsProgress等屬性)

另一種選擇是使用ThreadPool,如果你的方法也不會花費太多時間:

ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc)); 
... 
static void ThreadProc(Object stateInfo) { ... } 

另一個選擇是調用BeginInvoke on a delegate

public delegate int MyDelegate(...); 

MyDelegate del = SomeFunction;      
IAsyncResult ar = del.BeginInvoke(...); 
int result = del.EndInvoke(ar); 

這將執行從線程池中的線程。如果您需要等待調用線程,則可以使用IAsyncResult.IsCompleted,但它會阻止調用線程。

和當然,你可以使用Task

var task = Task.Factory.StartNew(() => MyMethod()); 

這也從線程池中的線程執行MyMethod,所以同樣的警告適用(雖然你可以使用​​,以確保新的線程總是被創建)。在某些情況下(當你等待任務),它甚至可以在同一個線程上執行,但它已經很好的優化,所以你不應該擔心。

這可能是最簡單的選擇與控制的簡單(當然,沒有真正的'最好的')。這裏好處(從Jon Skeet's answer無恥被盜):

  • 添加延續(Task.ContinueWith)
  • 等待多個任務來完成(全部或任何)
  • 的任務,並詢問他們捕獲錯誤後來
  • 捕獲消除(並允許你指定消除與啓動)
  • 潛在具有返回值
  • 在C#中使用的await 5
  • 在調度
  • 更好的控制(如果它的將是長期運行的,所以說,當你創建任務,使任務調度器可以考慮到這一點)
+0

非常具有描述性,完全摧毀了我的答案+1給你很好的先生。 – Nomad101 2013-05-02 10:02:48

0

我有一個博客貼子,compares and contrasts various implementations of background tasks,優點和每個的缺點。擾流板:Task絕對是最好的選擇。此外,我建議Task.Run超過TaskFactory.StartNew

如果您的後臺操作是真正異步的,那麼您可能根本不需要任何後臺線程。 LINQPad有一個set of async examples這是一個很好的起點。這些比其他人推薦的線程(由同一作者)章節更新。