2016-04-05 17 views
0

C# için yeni ve ne zaman zaman uyumsuz/bekliyoruz yeni konuları oluşturmak etmediğini biliyoruz olarak konuları kullanmak hangi durumlarda zaman uyumsuz/beklemektedir kullanmaya merak edildi ve. Önümüzdeki on saat merhaba her saat baskı planlamak istiyorsanız aşağıdaki iki baskı yöntemlerinin kullanılması gerektiğini ÖrneğinAsync/bekliyoruz Konular vs Senaryo

?

private async void PrintHelloAsync(int delay) 
    { 
     await Task.Delay(delay); 
     Console.WriteLine("Hello"); 
    } 

    private void PrintHelloThread(int delay) 
    { 
     Task.Run(async() => 
     { 
      await Task.Delay(delay); 
      Console.WriteLine("Hello"); 
     }); 
    } 

Ben gecikmeler artan veya PrintHelloThread ile PrintHelloAsync 10 kez arasak mı?

Bu eşzamanlılık kavramlarını doğru şekilde kullandım mı?

Şu anda ben 18:00, 9 pm ve Geceyarısı bir görev zamanlama gereken bir proje üzerinde çalışıyorum ve bunu yapmanın en iyi yolu anlamaya çalışıyordu.

+0

İki işlev temelde aynı şeydir, ancak ikincisi beklenemez. 'PrintHelloThread' sadece bir kez" Hello "yazdıracaktır. Async'ın beklemediğini söyleyen –

+0

yeni thread oluşturmuyor mu? Async yöntemleri bazı async çalışmaları yapmak için varsayalım. Çağıran iş parçacığı, bekletme ifadesi ile karşılaşıldığında yürütmeye devam eder. Async yönteminin geri kalanını yürütmek için yeni bir iş parçacığı (iş parçacığı havuzuna bağlı olarak) oluşturulabilir. –

cevap

1

iki işleve arasındaki temel fark birincisi tarafından gerçekleştirilen olmasıdır arama iş parçacığı, ikincisi ise iş parçacığı havuzundaki boş bir iş parçacığı tarafından çağrılır. stackoverflow

Birisi metaforunu (Eyvah ben artık onun adını bilmiyorum) kullanarak fark defasında bana açıkladı.

Kahvaltı yapmak istediğinizi varsayalım. Biraz ekmek atıp biraz yumurta kaynatmalısın.

Sen ekmek tost kadar tost makinesinden tost ekmeği çıkarmak, bekleyip kaynar su başlatmak, tost makinesi içinde biraz ekmek koyabilirim. Su kaynadıktan sonra yumurtaları ekleyin, biraz bekleyin ve yumurtaları sudan alın ve ateşi söndürün. Bu, eşzamanlı yürütmenin tipik bir örneğidir. Diğer taraftan, ekmeği tost makinesine koyduktan sonra, kaynar suya bile başlayabilirsiniz. Ekmekler kızartılıncaya veya su kaynana kadar bekleyiniz. İlk durumda ekmeği çıkaracak ve suyun kaynatılmasını bekleyeceksiniz. İkinci durumda, yumurtaları suya koyacak ve ekmeğin tostu ya da yumurtalar hazır olana kadar bekleyeceksiniz. Bir şey olmasını beklemek zorunda olduğunuz anda, süreci hızlandırmak için başka bir şey yapıp yapamayacağınıza bakın: asenkron yürütmenin tipik bir örneği, ancak yine de bir iş parçacığı tarafından gerçekleştirilir. Bu, ilk işleviniz tarafından kullanılan yöntem, uyumsuz kullanımları yöntemidir. Birkaç parçacığı tarafından gerçekleştirilen eşzamanlı işlemeyi:

en pahalı yöntem Bana yumurta kaynatmak için su ısıtmak başlarken biraz ekmek tost sipariş edecek aşçı kiralama olduğunu.

Yapmanız gereken tek bir iş parçacığınız varsa, bu iş parçacığı bir şeyi pişirmek için bir aşçı işe alır ve iş parçacığı hazır olana kadar beklemesine izin vermezse akıllıca değildir: neden iş parçacığının işi yapmasına izin vermeyin?

Eğer iş parçanızın yapacak başka bir görevi yoksa, ilk işlevinizi kullanın.

Ancak bu ilk işlev yalnızca iş parçacığınız bir eşzamanlama işlevinin kendisinde çalışıyorsa çağrılabilir. Eğer iş parçacığınız bir uyumsuz fonksiyonda değilse ve ekmeğiniz kızartılırken anlamlı bir şey yapabilirse, ikinci yönteminizi kullanmayı düşünün.

1

Nihayetinde amacınızın 6PM, 9PM, vb. Için görevlerinizi planlamak olduğunu varsayalım. Çok fazla ayrıntıya girmeden, büyük olasılıkla yanlış yola giriyorsunuz (gecikmiş görevler ve iş parçacıkları hakkında düşünme). Bunun yerine, bir windows hizmetinde barındırılan Quartz.net veya HangFire gibi bir programlayıcı sistemine bakmanızı veya uygulamanızı belirli bir zamanda başlatmak için yalnızca Windows görev zamanlayıcıyı kullanmanızı öneriyorum.

bir zamanlama sistemi kendini uygulamak başka çaresi varsa, bir başlangıç ​​olarak System.Timers.Timer sınıfında görünecektir:

using System; 
using System.Threading.Tasks; 
using System.Timers; 

class Example 
{ 
    static void Main() 
    { 
     Timer timer = new Timer(1000); 
     timer.Elapsed += async (sender, e) => await HandleTimer(); 
     timer.Start(); 
     Console.Write("Press any key to exit... "); 
     Console.ReadKey(); 
    } 

    private static Task HandleTimer() 
    { 
     Console.WriteLine("Timer event"); 
    } 
} 
+0

Maalesef her şey işyerinde tamamen kilitleniyor ve sadece dahili olarak geliştirilmiş kütüphanelere erişimim var. – Ben

+0

Windows görev zamanlayıcılarını kullanmak istememenizin bir nedeni var mı? –

+0

Görev, önceden kullanıcı girişi gerektiriyor, dolayısıyla 6PM'de istenen değer bu olacak, görevi 9PM ve gece yarısı için aynı, bu değerle gerçekleştirin. Bu değerler, günlük olarak ticari faaliyete ve kullanıcı tarafındaki bazı öznel konulara göre değişir. – Ben