SORU
22 Ocak 2013, Salı


nasıl ve zaman uyumsuz kullanmak `ve` bekliyor.`

Anladığım tek şey bu async await yapmak için kod yazılması ve okunması kolay - kullanarak onları eşit yumurtlama arka plan iş parçacığı gerçekleştirmek için uzun süreli bir mantık?

Şu anda en basit örnek deniyorum. Bazı yorumlar içi ekledim. Benim için netleştirebilir misiniz?

// i don't uderstand why this method must be marked as "async'.
private async void button1_Click(object sender, EventArgs e)
{
    Task<int> access = DoSomethingAsync();
    // task independent stuff here

    // this line is reached after the 5 seconds sleep from 
    // DoSomethingAsync() method. Shouldn't it be reached immediately? 
    int a = 1; 

    // from my understanding the waiting should be done here.
    int x = await access; 
}

async Task<int> DoSomethingAsync()
{
    // is this executed on a background thread?
    System.Threading.Thread.Sleep(5000);
    return 1;
}

CEVAP
14 Kasım 2013, PERŞEMBE


async await kullanırken derleyici arka planda devlet bir makine oluşturur.

Burada üzerinde devam eden üst düzey bazı ayrıntıları açıklayabilirim umarım bir örnek:

public async Task MyMethodAsync()
{
    Task<int> longRunningTask = LongRunningOperationAsync();
    // independent work which doesn't need the result of LongRunningOperationAsync can be done here

    //and now we call await on the task 
    int result = await longRunningTask;
    //use the result 
    Console.WriteLine(result);
}

public async Task<int> LongRunningOperationAsync() // assume we return an int from this long running operation 
{
    await Task.Delay(1000); //1 seconds delay
    return 1;
}

Tamam, burada ne oluyor o halde:

  1. Task<int> longRunningTask = LongRunningOperationAsync(); LongRunningOperation yürütme başlar

  2. bağımsız çalışma Ana iş Parçacığı (Thread İD = 1) await longRunningOperation ulaşmış olduğunu varsayalım.

Bu longRunningOperation bitirmedi ve hala çalışıyorsa, MyMethod() arama yöntemi dönecektir, böylece ana iş parçacığı bloke etmiyor. Ne zaman longRunningOperation yapılır sonra bir iş parçacığı Havuzu (herhangi bir konu olabilir) döndürür MyMethod() onun önceki bağlam ve devam yürütme (bu durumda baskı sonucu konsol).

İkinci bir vaka longRunningOperation zaten yürütme tamamladı ve sonucu mevcuttur. await longRunningOperationulaşırken biz zaten bu kod aynı konu üzerinde çalıştırmaya devam edecekse çok sonuç var. (bu durumda konsol için sonuç baskıda). Tabii ki bu Task.Delay(1000) bir işin içinde olduğu yerde örneğin yukarıdaki durumda değildir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ExcelIsFun

    ExcelIsFun

    16 ŞUBAT 2008
  • Techmoan

    Techmoan

    31 Mayıs 2009
  • The Pet Collective

    The Pet Coll

    5 Ocak 2012

İLGİLİ SORU / CEVAPLAR