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

  • isupportthegosselins

    isupporttheg

    6 Aralık 2009
  • NLthomas21

    NLthomas21

    20 Mayıs 2008
  • William Hyde

    William Hyde

    23 HAZİRAN 2008