2016-04-09 8 views
0

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ı?

+0

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

cevap

0

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.

+0

Teşekkürler, iş parçacığı hile yapmış gibi görünüyor :) – LonelyPyxel

0

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.

0

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.

0

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 
} 
İlgili konular