SORU
21 Kasım 2010, Pazar


Zaman uyumsuz olarak Görev<T> zaman aşımı ile tamamlamak için bekleyin

Task<T> beklemek için bazı özel kurallar ile tamamlamak istiyorum: Eğer X milisaniye sonra tamamlanmış değil varsa, kullanıcıya bir mesaj görüntülemek istiyorum. Ve eğer Y milisaniye sonra tamamlanmış değil varsa, otomatik olarak 5* *istiyorum.

Uyumsuz Task.ContinueWith görevi tamamlamak için sabırsızlanıyorum (görev tamamlandığında yürütülecek bir eylem yani zamanlama), ama bu bir zaman aşımı belirtmek için izin vermez. Senkronize olarak görev engelleyen bir zamanaşımı, ama ben konuyu tamamlamak için beklemek Task.Wait kullanabilirim. Nasıl uyumsuz olarak görev için bir zaman aşımı ile tamamlamak için bekleyebilir mi?

CEVAP
25 HAZİRAN 2012, PAZARTESİ


Buna ne demeli

int timeout = 1000;
var task = SomeOperationAsync();
if (await Task.WhenAny(task, Task.Delay(timeout)) == task) {
    // task completed within timeout
} else { 
    // timeout logic
}

Ve burada a great blog post "Crafting a Task.TimeoutAfter Method" (from MS Parallel Library team) with more info on this sort of thing.

Ayrıcabenim cevap hakkında bir yorum isteği üzerine, burada iptal işleme içeren genişletilmiş bir çözümdür. Unutmayın geçen iptali için görev ve zamanlayıcı demek ki var birden çok yolu iptal olabilir deneyimli kodunuzu, emin olmak için test ve kendine güven düzgün bir şekilde işlemek hepsini. Çeşitli kombinasyonları şans ve bilgisayarınızı zamanında doğru olanı yapar ve umut etmeyi bırakma.

int timeout = 1000;
var task = SomeOperationAsync(cancellationToken);
if (await Task.WhenAny(task, Task.Delay(timeout, cancellationToken)) == task)
{
    // Task completed within timeout.
    // Consider that the task may have faulted or been canceled.
    // We re-await the task so that any exceptions/cancellation is rethrown.
    await task;

}
else
{
    // timeout/cancellation logic
}

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • PhoneArena

    PhoneArena

    7 NİSAN 2006
  • Ralph Phillips

    Ralph Philli

    5 Aralık 2006