C# içinde uyuyan bir konu uyandırmanın bir yolu var mı? Yani, uzun bir süre uyumak ve işlenmek istediğinizde uyandırmak mı?Bir uyku ipi uyandırmanın bir yolu var mı?
cevap
bir AutoResetEvent
nesne (veya başka bir WaitHandle
uygulanması) uyku kullanılabilir:
// launch a calculation thread
var waitHandle = new AutoResetEvent(false);
int result;
var calculationThread = new Thread(
delegate
{
// this code will run on the calculation thread
result = FactorSomeLargeNumber();
waitHandle.Set();
});
calculationThread.Start();
// now that the other thread is launched, we can do something else.
DoOtherStuff();
// we've run out of other stuff to do, so sleep until calculation thread finishes
waitHandle.WaitOne();
Eğer iş parçacığınız Sleep
numaralı aramanın içindeyse, o zaman (genellikle) onu uyandırmanın bir yolu yoktur. (Fark ettiğim tek istisna, Java'nın, başka bir iş parçacığının thread.interrupt()
numaralı telefonu çağırması durumunda bir uykunun erkenden bitmesine izin vermesidir.)
Konuştuğunuz model bir olay için çağrı yapıyor gibi görünüyor: Bir döngü, bir olayın ateşlenmesini bekler. Olay şu anda unset ise, iplik başka bir iş parçacığı olayı tetikleyene kadar "uyur". Bu noktada, uyku ipliğiyle uyanır ve bir başka olayı beklemek için uyuduğu sırada bir sonraki zamana kadar çalışmasına devam eder.
@John, bu bilgiyi eklemek için düzenlerken yorumunuzu eklediniz :). –
Yeterince adil yorumumu kaldırırım :) –
this İpliği yardım eder misiniz? C#, Olay işleme iş parçacığı için good functionality sahiptir. Çalışmamın çoğunu Python'da yaptım, ama C# iş parçacığı engelleme için katı kitaplıklara sahip görünüyor. başka bir akıştan bir sinyal alınana kadar
iyi çözüm varsayılan TaskFactory
ile Task
nesneleri kullanmak olacaktır. Bu API (.NET 4.0'da tanıtılmıştır), iş çalma sıralarına ve tüm bu güzel şeylere sahip bir iş parçacığı havuzu kullanır.
.NET 4.0 kullanılamıyorsa, yerleşik bir iş kuyruğu olan (bazı havuz dengelemesi yapan ancak 4.0 iş parçacığı havuzu ile aynı kapsamda olmayan) ThreadPool
'u kullanın.
Eğer gerçekten kendiniz yapıyorsanız, o zaman .NET 4.0'da eklenen bir engelleme tüketici/yapımcı kuyruğu olan BlockingCollection<T>
öneririm.
gerçekten gerekir yaparsanız kendiniz ve o zaman işin lock
korumalı kuyrukta birlikte ManualResetEvent
veya AutoResetEvent
bir kullanabilir, .NET 4.0 kullanamaz.
public void WakeUp()
{
if (Thread.CurrentThread.ThreadState == ThreadState.WaitSleepJoin)
Thread.CurrentThread.Interrupt();
}
Bu iş parçacığı ve uyandırmayacak. – Danpe
@Danpe İpliği iptal ettiğinden şüpheliyim, o zaman buna bir kesinti demenin anlamı ne olurdu? Bunu okuyun: http://msdn.microsoft.com/en-us/library/system.threading.thread.interrupt(v=vs.110).aspx Bu istisnayı yakalamak zorunda kalacaksınız. –
OP'nin ne istediğini bu şekilde gerçekleştiremezsiniz. İş parçacığı kodunun, işletim sisteminin iş parçacığının yeniden işlenmesini sağlamak için sinyal vermesini beklediği kesin bir "bekleme" noktası olmalıdır. 'Sleep' veya' SpinWait' veya 'Yield' için yapılan çağrılar diziyi' WaitSleepJoin' durumuna geçirir. – Slight
- 1. iOS: Kullanıcının bulunduğu yeri uyandırmanın bir yolu var mı?
- 2. Selenyumda bekleme ve uyku kullanmaktan kaçınmanın bir yolu var mı?
- 3. C# Normal İfade ipi bir koleksiyonu var
- 4. şöyle ipi bir listesi var Strings
- 5. Bir Heroku Dyno'yu uyumaya zorlamanın bir yolu var mı?
- 6. bir dize dışında bir İpi çekin ben bir dize var
- 7. CGPoints'i karşılaştırmanın bir yolu var mı?
- 8. RubyGems'i çevrimdışı güncellemenin bir yolu var mı?
- 9. Düzenleri canlandırmanın bir yolu var mı? [Android]?
- 10. Hafızayı sınırlamanın bir yolu var mı?
- 11. Pydev'de REPL almanın bir yolu var mı?
- 12. YQL'i HTML'ye döndürmenin bir yolu var mı?
- 13. Parametreyi çıkarmanın bir yolu var mı?
- 14. WiX yapılarını hızlandırmanın bir yolu var mı?
- 15. Tip bildirimlerini genişletmenin bir yolu var mı?
- 16. cuBLAS'da "saypx" yapmanın bir yolu var mı?
- 17. Files.write (...) yöntemini almanın bir yolu var mı?
- 18. "Vurgulu" kodun herhangi bir yolu var mı?
- 19. SKActions'i duraklatmanın bir yolu var mı?
- 20. Keyboard.FocusedElement öğesine bağlamanın bir yolu var mı?
- 21. Scala'nın RichString'ini genişletmenin bir yolu var mı?
- 22. django.db.connection.queries öğesini temizlemenin bir yolu var mı?
- 23. Özel SmartArt geliştirmenin bir yolu var mı?
- 24. ConfigurationManager.AppSettings'i geçersiz kılmanın bir yolu var mı?
- 25. C harflerini saymanın bir yolu var mı?
- 26. IComparer'dan IEqualityComparer türetmenin bir yolu var mı?
- 27. Python'da + = aşırı yüklenmenin bir yolu var mı?
- 28. Bunu F # yazmanın bir yolu var mı?
- 29. PDF'leri pdf.js'de birleştirmenin bir yolu var mı?
- 30. TensorFlow baskılarını bastırmanın bir yolu var mı?
Tam olarak hangi ayarda? Bunu anlamlı bir şekilde cevaplayabilmek için kullandığınız platform ve/veya iş parçacığı modeli hakkında daha fazla bilgiye ihtiyacımız var. – Gian
Uyumaya nasıl koyduğuna bağlı. – zneak
Kesinlikle en azından bu sorunun hangi programlama diliyle ilgili olduğunu söylemelisiniz. – scy