我希望知道在哪裏可以獲得多線程或異步線程的示例。異步線程
在我忙於應用程序中,我必須在應用程序的後臺運行一個線程來獲取正在更改的值。每當這個值達到一定數量時,它就需要調用另一個函數。所有這些都必須在程序的後臺運行,以便用戶仍然可以在應用程序上執行其他操作。
任何可能會有所幫助的示例或鏈接都將得到真正的讚賞。
我希望知道在哪裏可以獲得多線程或異步線程的示例。異步線程
在我忙於應用程序中,我必須在應用程序的後臺運行一個線程來獲取正在更改的值。每當這個值達到一定數量時,它就需要調用另一個函數。所有這些都必須在程序的後臺運行,以便用戶仍然可以在應用程序上執行其他操作。
任何可能會有所幫助的示例或鏈接都將得到真正的讚賞。
那麼取決於你尋求的控制級別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
對於異步編程在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!";
}));
});
對於.net 4,TPL和它的任務是實現並行性的首選方式http ://msdn.microsoft.com/en-us/library/dd460717(v = vs.100).aspx – 2013-05-02 08:20:18
爲了總結選項,我會嘗試在這裏列出它們(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) {...}
您可以使用ProgressChanged
和RunWorkerCompleted
事件進行更多的控制(如以及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無恥被盜):
非常具有描述性,完全摧毀了我的答案+1給你很好的先生。 – Nomad101 2013-05-02 10:02:48
我有一個博客貼子,compares and contrasts various implementations of background tasks,優點和每個的缺點。擾流板:Task
絕對是最好的選擇。此外,我建議Task.Run
超過TaskFactory.StartNew
。
如果您的後臺操作是真正異步的,那麼您可能根本不需要任何後臺線程。 LINQPad有一個set of async
examples這是一個很好的起點。這些比其他人推薦的線程(由同一作者)章節更新。
http://www.albahari.com/threading/ – metadings 2013-05-02 07:03:46
後臺工作人員? http://msdn.microsoft。com/en-us/library/system.componentmodel.backgroundworker.aspx – NDJ 2013-05-02 07:05:46
異步*和*線程?你真的不知道你的代碼何時會運行,不是嗎。 :) – cHao 2013-05-02 07:22:04