2011-03-26 18 views
7

TPL'yi bir while döngüsünde kullanmaya çalışıyorum ve sonra da döngüye dönüşen bazı değerlere geçmem gerekiyor. endeks değeri olabilir, çünküBir döngü içinde görevlerin başlatılması: döngü içinde değiştirilebilecek değerler nasıl iletilir?

int index = 0; 
Task[] tasks; 
while(/*condition*/) 
{ 
    tasks[index] = Task.Factory.StartNew(() => DoJob(index)); 
    index++; 
} 

Ama tabii çalışmıyor: Örneğin, burada o (mutlaka görev oluşturma talep edildiği satırdan sonra) artırılır bir dizin ile bir örnek gösterilmektedir Görev başlamadan önce artar. Olası bir çözüm de, endeksi artırmadan önce beklemek ve DoJob yöntemine işaret edilmek zorunda olan bir WaitHandle geçmek olabilir, ama bana gerçekten iyi bir çözüm gibi görünmüyor. Başka bir fikrin var mı?

cevap

15

döngü içinde geçici bir değişkene değer atama:

int index = 0; 
Task[] tasks; 
while(/*condition*/) 
{ 
    int value = index; 
    tasks[index] = Task.Factory.StartNew(() => DoJob(value)); 
    index++; 
} 

her görev indexStartNew çağrısı hangi while döngünün yineleme sırasında sahip olduğu değerin kendi kopyasına sahip olacak, bu arada

oldu yapılmış.

+0

refactor her zaman bu kadar basit olmayabilir, fakat her zaman mümkün olabilir - iç içe döngülerden ayrılmayın:] –

İlgili konular