SORU
15 HAZİRAN 2013, CUMARTESİ


Görev koymak zorundasın.O zaman uyumsuz bir yöntem çalıştırmak?

En basit şekliyle uyumsuz bekliyor anlamaya çalışıyorum. Bu örnek için iki sayı ekler çok basit bir yöntem oluşturmak istiyorum, kabul ediyorum, hiçbir işlem süresi değil, sadece burada bir örnek formüle meselesi.

Örnek 1:

private async Task DoWork1Async()
{
    int result = 1   2;
}

Örnek 2:

private async Task DoWork2Async()
{
    Task.Run( () =>
    {
        int result = 1   2;
    });
}

Eğer DoWork1Async bekliyorum (varsa) kodu zaman uyumlu veya zaman uyumsuz olarak çalışır mı?

Görev ile senkronize kodu sarmak gerekiyor.Yöntem awaitable olun VE UI iş parçacığı engelleme için zaman uyumsuz?

Eğer benim yöntemi bir Görev veya Görev Görev kodu sarmam gerek döndürür anlamaya çalışıyorum.Çalıştırmak asenkron yapmak.

Aptal ama bir Görev daha hiçbir şey içinde uyumsuz ve tamamladı kod bekleniyor yerde net örnekler görüyorum eminim soru.Çalıştırmak veya StartNew.

CEVAP
15 HAZİRAN 2013, CUMARTESİ


İlk olarak, bazı terimleri kadar açık: "uyumsuz" (async) başlamadan önce kontrol iş parçasıyla geri verim anlamına gelir. async bir yöntem, o "" puan await ifadeleridir. verim

Bu dönem çok farklı."", (mis)yıl TechNet belgeleri kullandığı anlamına "arka plan iş parçacığında yürütür". asenkron

İçin daha fazla karıştırmayın sorunu, async çok farklı "awaitable"; bazı async yöntem olan geri tipte değildir awaitable ve birçok yöntem dönen awaitable türleri değildir async.

Onlar ne kadar ilgilideğil; burada ne var:

  • async anahtar kelime, zaman uyumsuz bir yöntem (await ifadeler sağlar) sağlar. async yöntemleri Task, Task<T> ya da eğer gerekiyorsa () void döndürebilir.
  • Belirli bir desen takip eden her tür awaitable olabilir. En yaygın awaitable türleri Task Task<T>.

Eğer "nasıl bir işlemi çalıştırabilir miyim . sorunuzu biz yeniden formüle eğer öyleyse, ^em>bir arka plan iş parçacığı üzerinde"cevap Task.Run kullanmak için: . awaitable bir şekilde

private Task<int> DoWorkAsync() // No async because the method does not need await
{
  return Task.Run(() =>
  {
    return 1   2;
  });
}

(Ama bu desen zavallı bir yaklaşımdır; aşağıya bakınız).

Ama eğer soru "nasıl oluştururum async yöntem olabilir verim geri arayan yerine engelleme", cevap beyan yöntemi async await için "verimli" puan:

private async Task<int> GetWebPageHtmlSizeAsync()
{
  var client = new HttpClient();
  var html = await client.GetAsync("http://www.example.com/");
  return html.Length;
}

Bu yüzden, şeylerin temel desen async kod "" await ifadeleriyle. awaitables bağlı olmasıdır Bu "" async diğer yöntemler olabilir veya awaitables dönüyor. normal yöntemler sadece awaitables Normal yöntemlerle 30*/Task<T> *dönüyorolabilirTask.Run bir arka plan iş parçacığı üzerinde kod çalıştırmak için kullanın, ya da (daha sık) TaskCompletionSource<T> veya kısayolları (TaskFactory.FromAsync, Task.FromResult, vs.) kullanabilirsiniz. BenyokTask.Run; eşzamanlı yöntemleri senkron imzaları gereken tüm yöntem sarma tavsiye ve Task.Run bir sarılmış gerekip gerekmediğini tüketiciye Yukarı olmalıdır:

private int DoWork()
{
  return 1   2;
}

private void MoreSynchronousProcessing()
{
  // Execute it directly (synchronously), since we are also a synchronous method.
  var result = DoWork();
  ...
}

private async Task DoVariousThingsFromTheUIThreadAsync()
{
  // I have a bunch of async work to do, and I am executed on the UI thread.
  var result = await Task.Run(() => DoWork());
  ...
}

Blogumda async/await intro var; sonunda bazı iyi kaynakları izlemek. async web docs olağanüstü iyi, çok.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • kalabrandmusic

    kalabrandmus

    25 Kasım 2009
  • LIVESTRONG.COM

    LIVESTRONG.C

    5 EKİM 2005
  • Rhapsody

    Rhapsody

    7 ŞUBAT 2008