2016-03-25 16 views
2

Sorun, tamamlandığında bazı uyumsuzluk blokları önce ateş bekliyor gibi görünüyordu. Ya bir şey yaptığım için, nesneler desteklemiyor ya da daha büyük olasılıkla, bir yere batırıldım. çok koduna ihtiyaç duyulan Sorun oluşmaya beri Ancak, bir kod dökümü = (Ben bu, biraz yardımcı olur umarımC# eylem bloğu beklemesi beklendiği gibi çalışmıyor

kabul edildi.

Ben Broadcastblock hendeğe ve bir görev tabanlı boru hattına geçti.

kendi girişi yazma erişimine sahip olması gerekir tarayıcısı için görev fabrika kullanarak

. problemler https://msdn.microsoft.com/en-us/library/ff963548.aspx

çözüldü

Bunlardan senkronizasyon versiyonu fo idealdir r yavaş üreticileri/hızlı tüketiciler

taskfactory -> görevlerinizi oluşturmak ve bir BlockingCollection yoluyla bağlamak, ne yazık ki bir foreach son bayrağıyla enumerable tüketen

+4

Bu soruda çok fazla kod var ve aynı zamanda sorunu güvenilir şekilde yeniden üreten iyi bir [mcve] sağlamadınız. Lütfen bu soruyu geliştirin. –

+0

Yaptığımı sanıyordum, Salı günü kodu yeniden yazacağım. Herhangi bir özellik var mı? Size eylem bloğu bağlamını vermeyi düşündüm ve eylem bloğu yeterli olacaktır. – gismo

+0

"Tam" ve "minimal" sözcükleri bir nedenden ötürü [mcve] ifadesindedir. "Bağlam" sağlamak yeterli değildir, ya da kodunuzu buraya dökmek yeterli değildir. Sorunuza uygun hale getirilmiş bir kod örneği _craft_. Hiçbir kod eklenmeden derlenip çalıştırılabilmeli ve sorunu yeniden üretmek için gerekli olan bare _minimum_ kodu dışında _nothing_ içermesi gerekir. Daha fazla bilgi için lütfen [mcve] okuyun. –

cevap

0

Tamam bu ile birleştirme yöntemi değiştirmeyi deneyin:

splitter.Complete(); 
sorter.Complete(); 
await Task.WhenAll(svn, splitter.Completion, sorter.Completion); 
:

da
private static async Task merge(Func<ConcurrentDictionary<string,int>> getter, Action<ConcurrentDictionary<string,int>> setter, List<parserPart>list) 
     { 
      List<Task> tasks = new List<Task>(); 
      var target = getter(); 
      int buffer; 
      foreach (parserPart b in list) 
      { 
       tasks.Add(Task.Factory.StartNew(() => { 
        target.TryGetValue(b.uploader_id, out buffer); 
        target.TryAdd(b.uploader_id, (buffer + b.count)); 
       } 
      } 
      Task.WaitAll(tasks.ToArray()); 
      await Task.Run(() => setter(target)); 
      Console.Writeline("merging task"); 
     } 
    } 

, Tamamlanma bekleyen önce komple yöntemi kullanın

PS .. Bunu çoğaltmak için çok fazla kod olduğu için test etmedim, ancak bazı sonuçları aldıktan sonra birleştirme yönteminizin çalışmaya devam ettiğini söylemiştiniz, bu nedenle, bu görev listesini oluşturarak tüm listeyi bekleyebilirsiniz. sonuçları almadan önce bitirin.

+0

işlemek istiyorum teşekkürler! 13 üzerinde test edeceğim. Şu an koduma veya VS'ye erişimim yok. Sonuçlardan haberdar edeceğim. – gismo

+0

Fikriniz Problemi kısmen düzelttikten sonra, birleştirme fonksiyonu artık program ana duruma döndükten sonra sadece 2 mesaj veriyor. Yakında sorunun yeni bir sürümünü yükleyeceğim, bu sefer umarım gayet basit =) – gismo

+0

Bu, Problemi tam olarak çözmedi, ancak Spluf deneyen tek kişiydi ve cevabı beni problemin saptamasına neden oldu/orijinal kodumun yayın blokları – gismo

0
(bu gibi bir tarayıcı için iyi olurdu) sahip olamaz

Komple yöntem, ihtiyacınız olanı yapacağına inanıyorum. Belgeler burada iyi bir örnek vardır:

https://msdn.microsoft.com/en-us/library/hh194731%28v=vs.110%29.aspx

+1

Yöntem, verilerin kabul edilmesini durduracaktır, ancak tüm veriler işlendiğinde olduğu gibi, beklendiği gibi, herhangi bir yeni veriyi engeller. Ben – gismo

İlgili konular