2011-08-09 19 views
9

Belirli bir delege iş parçacığının hangi yürütmeyi başlatabileceğinin bir yolu var mıdır, öyle ki başlangıçta çağrı iş parçacığı üzerinde çalıştırabilirim, ancak belirli bir süreden daha uzun sürüyorsa yürütmeyi bir arka plan iş parçacığına taşıyabilirim ?Bir temsilci yürütme işlemini bir iş parçacığından diğerine yürütmek mümkün mü?

Temsilcinin eşzamansız yazıldığını varsayalım. Senkronize bloklar almaya çalışmıyorum ve paralellik artırma için onları arka plan iş parçacığına taşımaya çalışmıyorum, ancak basit işlemlerde iş parçacıklarının önüne geçerek asenkron yürütme performansını artırmaya çalışıyorum. Ben vb net yığın sınırları kurulması eğer bir temsilci veya lambda yürütülmesi durdurulmuş olabilir herhangi bir şekilde olup olmadığını

Temelde merak ediyorum, başka bir iş parçacığı taşındı ve yeniden

Ben bu mümkün şüphe , Ben sadece merak ediyorum.

cevap

3

Bu mümkün, ancak doğru olması zor ve zor olurdu. Bunu gerçekleştirmenin en iyi yolu, coroutines'u kullanmaktır. .NET'te şu anda koroutin paradigmasına uyan tek mekanizma, yield return anahtar sözcüğüyle C# 'nin yineleyicileridir. , bir yöntemin bir iş parçacığından diğerine geçişini sağlayan . Ancak, bu bir blog layık hack daha az bir şey olurdu, ama ben mümkün olduğunu düşünüyorum.

Bir sonraki en iyi seçenek devam etmek ve Async CTP sürümüne yükseltmektir. Bu, C# 'de mevcut olacak ve tam olarak ne istediğinizi yapmanıza izin verecek bir özelliktir. Bu, önerilen await anahtar kelimesi ve ayrıca dahil edilecek bazı akıllı istismarlar ile zarif bir şekilde gerçekleştirilmiştir. Sonuçta follwing gibi bir şey görünecektir.

public async void SomeMethod() 
{ 
    // Do stuff on the calling thread. 

    await ThreadPool.SwitchTo(); // Switch to the ThreadPool. 

    // Do stuff on a ThreadPool thread now! 

    await MyForm.Dispatcher.SwitchTo(); // Switch to the UI thread. 

    // Do stuff on the UI thread now! 
} 

Bu sadece yeni await anahtar kelime ile yapabileceğiniz birçok kötü serin hileler biridir.Hedef özellikle bir iş öğesi şeklinde enjeksiyonu kabul etmek üzere tasarlanmış olup olmadığını aslında varolan iplik üzerine kod çalıştırılmasına enjekte edebilir


tek yoludur.

Sen adım adım elde await anahtar kelimeyi taklit az bir tür girişimi için benim cevap here görebilirsiniz. MindTouch Dream çerçevesi başka, muhtemelen daha iyi bir varyasyondur. Asıl nokta, bazı dahice bilgisayar korsanlığı ile iş parçacığının değişmesine neden olmasının mümkün olması gerektiğidir.

+0

Büyüleyici! “Beklemede” ve Async CTP'de daha fazla araştırma yapmak zorunda kalacağım. İtiraf etmeliyim ki, bir süre önce okuduğumda, "bekle" nin ne olduğunu anlayamadım. – devios1

+0

Vay; Bu kaygan. –

2

Kolayca değil.

Temsilcinizi bir durum makinesi olarak yapılandırırsanız, durumlar arasındaki yürütme süresini izleyebilir ve istediğiniz eşiğe ulaştığınızda yeni bir iş parçacığında bir sonraki durumu başlatabilirsiniz.

Başlamak için yeni bir iş parçacığında başlatmak basit bir çözüm olacaktır. Herhangi bir sebep kabul edilemez mi?

(telefonumdan gönderme - Gerekirse ben gerçek bir klavye de fırsat buldukça gidip pseudocode vereceğiz)

+0

Hmm, düşünmediğim ilginç bir fikir. Benim amaçlarım için, delegelerin formatını oldukça basit tutmakla daha çok ilgileniyorum (durum makineleri aşırı olacaktı). Muhtemelen iplik havuz ipliklerini kullanma yoluna gideceğim; Önemsiz operasyonlar için optimizasyon yapmanın herhangi bir yolu olup olmadığını merak ettim. – devios1

+0

Evet, sadece bir döngüde bir dizi benzer işlem gerçekleştirdiğinizden, bir FSM'nin aşırı derecede olduğunu söylüyorsunuz. Bu durumda, tahmini iş yükünü/iterasyonlarını temel alarak gerekli yürütme sürelerini tahmin edebilir ve hangi ipliğin kullanılacağına dair bir karar verebilirsiniz. –

+0

Evet, bu konuda da biraz düşündüm ... belki geçmiş yürütme zamanlarını bir veri tabanını tutmak ve bir arka plan iş parçacığı üzerinde çalışıp çalışmadığı konusunda bilinçli bir karar vermek için ortalamayı kullanmak. Elbette, tüm ölçütleri yapmanın muhtemelen güncel iş parçacığı üzerinde çalışarak kazanacağınız optimizasyondan daha uzun süreceğini düşünmeniz gerekir (aslında, neredeyse garanti edilir). Yani gerçekten bir moot noktası haline gelir. Yine de düşünmek için ilginç. – devios1

1

Hayır bunu mümkün olduğunu sanmıyorum. En azından düzenli delegelerle doğrudan değil. Biraz işten sonra ortaya çıkan bir çeşit IEnumerable oluşturduysanız, birkaç yinelemeyi elle çalıştırabilir ve ardından çok sayıda yineleme sonrasında arka plan iş parçacığına geçebilirsiniz.

ThreadPool ve TPL'nin Görevleri bol performansa sahip olmalı, her zaman arka plan iş parçacığında çalıştırılmalıdır. Bir Görev'i kullanmanın, bir sürü yüke neden olunduğunu, belirli bir optimizasyona sahip olmadıkça, zamanından önce optimize etmeye çalıştığınız gibi görünmüyorsa.

+0

Gerçekten de, erken optimizasyon konusunda haklısınız ve bunun farkındayım (Erken bir optimizasyon problemine sahip olduğumu kabul ediyorum, lol). Bu yüzden, dediğim gibi, gelecekteki potansiyel iyileşme için daha fazla merak uyandırmam. ;) – devios1

İlgili konular