Bu kötü bir soru ise özür diliyorum, kelimenin tam anlamıyla kod gün önce başladı. Kodun geri kalanı devam ederken arka planda bir döngü çalıştırmak için bir yol arıyorum. Bir C# konsol uygulamasında.Tamamen yeni kod için, kodun geri kalanı bir C# konsolu uygulamasında devam ederken sürekli bir döngü oluşturmamın bir yolu var mı?
cevap
Konulara bakın. Programınızın aynı anda iki şeyi yapmasına izin veriyorlar, bu da hedefinize benziyor. İşte bir öğretici: https://msdn.microsoft.com/en-us/library/aa645740%28v=vs.71%29.aspx
Sadece bir not, genellikle iş parçacığı kodlamaya başladıktan sonra öğrenmek için en kolay şey değildir. Belki de çözmeye çalıştığınız sorunla ilgili daha fazla ayrıntı verirseniz, daha kolay çözümler de bulabiliriz.
Teşekkürler, iş parçacığı hile yapmış gibi görünüyor :) – LonelyPyxel
Bu aslında şaşırtıcı derecede karmaşık bir konu :) olduğunu
tam Yapmaya çalıştığınız ne göre kullanabileceğiniz iki temel yaklaşım var. ise bu, bir iş parçacığı havuzu iş parçacığı için DoComplexCpuWork
yükünü üstlenecek
var someBackgroundTask = Task.Run(() => DoComplexCpuWork());
ana iş parçacığı (Task.Run
idam bir bedava edilir: Eğer CPU çalışmasını yaparken, sahip tek gerçek seçenek çoklu iş parçacığı kullanan Daha sonra devam edip etmediğini görmek için someBackgroundTask
sorgusunu sorgulayabilir ve sonucu okuyabilir (varsa)
Arka plan iş parçacığında sonsuz bir döngü istiyorsanız, genellikle uzun süre çalışırsınız. Görev - sadece Task.Run
belgeleri için okuyun, oldukça açık,
İkinci yaklaşım, 'un kullanım (fazla) işlemcisi ile uğraşmadığınız durumlarda yardımcı olur. Örneğin, bir ağ akışından veri bekleyen sonsuz bir döngüye veya yalnızca bir dosyayı bir yerden diğerine kopyalar. Bunlar üzerinde iş parçacığı yok gerek yok, tüm gereken zaman uyumsuz API'leri (genellikle ReadAllLinesAsync
ve benzeri gibi) kullanmaktır.
Böyle bir kodla uğraşmaya başlar başlamaz, eşitlemeyi dikkate almalısınız. Varsayılan düşünce her zaman "haç iplik sınırlarının senkronize edilmesi gereken her şey" dir. Aynı alana iki iş parçacığından erişemez ve artık çalışmasını beklemezsiniz.
Eşzamansız kod ve çok iş parçacığı hakkında harika bir başlangıç http://www.albahari.com/threading/ - herhangi bir eşzamansız veya çok iş parçacıklı kodla uğraşmak isterseniz, tümünü okumalısınız. İdeal olarak birden çok kez. Ve referans için saklayın: P
Her ikisi de Windows Forms gibi bir grafik kullanıcı arayüzünde daha kolay olduğunu unutmayın. Tipik bir Windows uygulaması asenkron UI için bir mesaj döngüsü var Forms ve kolayca ve güvenli bir şekilde otomatik olarak tüm UI engellemeden, bir senkron görünümlü şekilde asenkron kod işlemek için
lblProgress.Text = "Calculating...";
var result = await Task.Run(() => DoWork());
lblProgress.Text = "Calculation done, sending to server.";
await SendDataToServerAsync(result);
lblProgress.Text = "Done.";
gibi kodu kullanabilirsiniz. await
'u kullanmayı öğrenmek istiyorsanız, bir UI uygulamasıyla başlamak kesinlikle daha kolay bir yoldur, çünkü altyapının çoğu zaten oradadır. Bir konsol uygulamasında kendi yazman gerekecek.
Microsoft, çok iş parçacıklı uygulamaların oluşturulmasının karmaşıklığını ve aynı verilere erişmeye çalışan birden fazla iş parçacığının neden olabileceği sorunları tanımaktadır. Uygulamanız için BackgroundWorker adı verilen bir sınıf olabilir.Çok kapsamlı bir öğretici here bulunabilir. Konuştuğunuz şeyleri başarmak için birçok kez kullandım ve daha karmaşık iş parçacığı görevlerinin çoğunu otomatik olarak yönetmekten yararlanır.
hepsi iyi puanlardır. Özel @luaan kapsamlı cevap. Yani hepsini tamamlamak için ve soruyu cevaplamak için, bunu yapabilirsiniz: bunu başarmak için
public void Main()
{
var backgroundLoop = Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
// This will be running in the backgroud
}
});
Console.WriteLine("Continuing with the program while the loop is running. Loop completed? " + backgroundLoop.IsCompleted);
backgroundLoop.Wait(); // Block here, and Wait until the loop is finished
}
- 1. "Vurgulu" kodun herhangi bir yolu var mı?
- 2. Bir döngü değişkenini kapatmak için Pythonic bir yolu var mı?
- 3. Bir git deposundaki kodun tamamen nasıl değiştirileceği
- 4. C# den SignerSignEx'i aramak için herhangi bir kodun var mı?
- 5. Sürekli olarak yeni satır eklemeksizin, bir satırdaki metin satırlarını birleştirmenin kolay bir yolu var mı?
- 6. Elisp'ten bir klavye makrosuna geri dönmenin bir yolu var mı?
- 7. Bir Android Studio güncellemesini geri almanın bir yolu var mı?
- 8. GoLang - Yansıtılan kodun kullanımını bellekte kullanmanın bir yolu var mı?
- 9. bir döngü devam ederken kaydedilmiş bir cevap tutmak için anlamaya olamaz
- 10. Bir IOS4 uygulamasında GLKit'i bağlamanın bir yolu var mı?
- 11. Visual Studio'da kaynaklar düzenleyicisi için karanlık bir temaya sahip olmanın bir yolu var mı?
- 12. C harflerini saymanın bir yolu var mı?
- 13. ggsave için yeni varsayılanlar belirlemenin bir yolu var mı?
- 14. TextMate'de büyük bir kod bloğunu yorumlamanın bir yolu var mı?
- 15. Her döngü için paralel olması için bir yol var mı?
- 16. Bir url'den "tail -f" gerçekleştirmenin bir yolu var mı?
- 17. C# 'da, bir diziyi döngü olmadan Stack <T>'a dönüştürmenin bir yolu var mı?
- 18. Kod çoğaltmasını önlemek için başkaları ile başa çıkmak için bir yöntem kullanmanın bir yolu var mı?
- 19. Sonsuz döngü var mı?
- 20. C# kod C# 3.0 satırında yazmak için daha iyi bir yolu var mı?
- 21. iPhone - Bir sınıf örneği ... ayrılmaya devam ederken anahtar değer gözetleme işlemi devam ederken
- 22. , VideoView uygulamasının Android uygulamasında arka planda oynatmaya devam etmesinin bir yolu var mı? Eve bastığınızda
- 23. Bir Dosyayı Geri Dönüşüm Kutusu'na Taşımanın Winapi Yolu Var mı?
- 24. Bir vektör çizilebilir önizleme için bir yolu var mı
- 25. C++ için doxygen'i optimize etmenin bir yolu var mı?
- 26. İskelesi için bir Uygulama Yönetim Konsolu var mı?
- 27. NSCollectionView uygulamasında farklı görünümlere sahip olmanın bir yolu var mı?
- 28. Bir vim komutunun çıktısını arabelleğe yapıştırmanın bir yolu var mı?
- 29. Bir C makrosunda alıntıları kaldırmanın bir yolu var mı?
- 30. Döngü tamamen jQuery
en yaygın yolu parçacığı kullanmaktır. Yeni başlayanlara tavsiye edeceğim bir şey değil ama hey, belki de harikasınız: D. https://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx – Tibrogargan