簡體   English   中英

了解System.Threading.Tasks行為

[英]Understanding System.Threading.Tasks behavior

我目前正在嘗試通過使用Tasks來利用.Net 4.0中的並行線程進行性能優化。

我已經做了三種方法,可以返回某些對象或只是一個對象的集合。 讓我們稱它們為MethodA,MethodB和MethodC。

在MethodB內部,我有一個長時間運行的延遲-大約5-7秒。

var person = new Person();

person.A = Task.Factory.StartNew(() => Mystatic.MethodA()).Result;
person.B = Task.Factory.StartNew(() => Mystatic.MethodB()).Result;
person.C = Task.Factory.StartNew(() => Mystatic.MethodC()).Result;

現在,我期望在person.B之前設置/填充person.A和person.C屬性,但是我很難測試/調試它以驗證我的假設。

我已經在所有三個屬性上添加了並行監視,但是通過調試無法為我澄清事情。

如果我要填充一個主要對象,這是否也是優化多個方法調用的正確方法?

在我的情況下,我有5-7種不同的方法來收集數據,並且我想使它們並行化,因為其中一些相對耗時。

原則上,依賴定時是錯誤的,因為從不保證定時,尤其是在真實單詞條件下,定時是不能保證的。 如果需要確保任務已完成,則應該對它們進行適當的等待 或使用C#5.0異步等待或繼續。

簡而言之,不要巧合編程。 通過構造使程序正確。

您的假設是錯誤的。 Task的Result屬性將有效地等待任務完成-因此,A,B,C將按該順序分配。 而且,這將破壞創建異步任務的目的。

一種方法是可以對所有三個任務使用Task.WaitAll,然后將每個任務的結果分配給A,B,C

如果您擁有VS2012,也可以使用async / await-您仍然可以使用http://nuget.org/packages/Microsoft.Bcl.Async/來定位.NET 4.0

但是請注意,如果您這樣做,那么async / await不會並行啟動3個任務:

person.A = await Task.Run(() => Mystatic.MethodA());
person.B = await Task.Run(() => Mystatic.MethodB());
person.C = await Task.Run(() => Mystatic.MethodC());

它仍然是順序的-如果您想要某種程度的並行執行,可以這樣做:

Task tA = Task.Run(() => Mystatic.MethodA());
Task tB = Task.Run(() => Mystatic.MethodB());
Task tC = Task.Run(() => Mystatic.MethodC());

person.A = await tA;
person.B = await tB;
person.C = await tC;   

暫無
暫無

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

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