2015-06-08 9 views
5

Bir Oracle db sorgusu ve Active Directory sorgusu için iki ayrı görevi oluştururken ve her ikisini de beklerken herhangi bir sorun veya sorun görüyor musunuz?arka plan iş parçacığı kullanarak Task.Run

Aşağıda çok basit bir sıyrılmış örnek gösterilmektedir. Esasen, AD'den ve bir Oracle DB'den gelen bilgi parçalarından oluşturulan bir çalışan nesnesine sahibiz. (Denilen sırayla) Employee nesne oluşturulur ve her iki sorguları araya getirilmiş ve kullanılabilir olup, bu noktada

var partialEmployeeA=ActiveDirectoryLookup(employeeID); 

var partialEmployeeB=OracleDBLookup(employeeID); 

var finalEmployee=Merge(partialEmployeeA,partialEmployeeB); 

. Bu sorun olmadan çalıştı, ancak bu çağrıların her biri kendi göreviyse, ölçekleme bakış açısından herhangi bir sorun görürdünüz?

Employee partialEmployeeA; 
Employee partialEmployeeB; 

var t1 = Task.Run(() => { 
    partialEmployeeA=ActiveDirectoryLookup(employeeID); 
}); 

var t2 = Task.Run(() => { 
    partialEmployeeB=OracleDBLookup(employeeID); 
});, 

Task.WaitAll(t1, t2); 
var finalEmployee=Merge(partialEmployeeA,partialEmployeeB); 

(başka bariz kod sorunları hariç) Ben kronometre sınıfı ve Task sürümü ile bazı test hızlı geri geliyor her zaman yaptığımız (ort: 100-120ms 200-250ms vs) ve hiçbir problem vardır, ama degildim Çok çekirdekli bir sistemde nasıl ölçeklendiğinden emin değilsiniz. TPL ile fazla bir şey yapmadım ama bu yaklaşımı merak ediyordum.

cevap

6

Bu konuda herhangi bir sorun görmüyorum, bunlar muhtemelen herhangi bir durumu paylaşmayan farklı isteklerdeki farklı hizmetlerdir. Ancak, her iki durumda da, tüm zaman uyumsuz (I/O) işlemi boyunca engellenen 3 iş parçacığı aldığınızı bilmelisiniz.

Bu işlemlerin birden çok iş parçacığı kullanılarak paralel olarak gerçekleştirilmesi daha hızlı olacaktır. Ancak aslında daha ölçeklenebilir olmayacaktır. API değişen gerektirir

var partialEmployeeATask = ActiveDirectoryLookupAsync(employeeID); 
var partialEmployeeBTask = OracleDBLookupAsync(employeeID); 

await Task.WhenAll(partialEmployeeATask, partialEmployeeBTask) 
var finalEmployee = Merge(await partialEmployeeATask, await partialEmployeeBTask); 

asenkron desteklemeye:

siz gerçekten zaman uyumsuz ve sadece bir arka plan iş parçacığı üzerinde bu işlemleri tedavisi için gereken kaynakları bir iş parçacığı ve engelleme kullanmadan bu "doğru" yapmak için Bazı formlarda istekleri. API kontrolünüzde değilse, sorun olabilir. Bu yapılmazsa en az Task.Run kullanın ve diğer parçaya "ana" iplik kullanın.

+0

Görevler beklemeden beklendiğinden, Task.WhenAll'i beklemekten daha iyi olmaz mıydı? Ya da daha iyisi, her iki görev de sonuç döndürdüğü için, sonuçları beklemeden “Task.WhenAll” sonucundan bir dizi olarak alamadınız mı? –

+0

Cevap i3arnon için çok teşekkürler. Paralel seçenek olarak engellenen iş parçacıkları hakkında daha fazla bilgi verir misiniz? Bu rotayı önleyecek ya da ne zaman önleyecek olan etkilere aşina değilim. – jdross

+0

@jdross - bkz. [MSDN: Async ve Await ile Eşzamansız Programlama] (https://msdn.microsoft.com/en-us/library/hh191443.aspx) –