SORU
18 Mayıs 2013, CUMARTESİ


/Yakalamak/bekliyor denemek için iyi bir çözüm sonunda?

Yine istisna (yığın izleme ile) bu gibi atmadan önce catch blok async bir yöntemi çağırmak istiyorum :

try
{
    // Do something
}
catch
{
    // <- Clean things here with async methods
    throw;
}

Ama ne yazık ki catch finally blok await kullanamazsınız. Derleyici geri catch bir blok gitmek için herhangi bir yol yok çünkü await talimat sonra falan ne böyle öldürmenin doğru olduğunu öğrendim...

Task.Wait() await değiştirmek için kullanmaya çalıştı ve bir kilitlenme var. Bunu önlemek ve this site nasıl bulduğunu Web üzerinde aradım.

Beri değiştiremeyeceğim async yöntem ne anlarım kullanıyorlar ConfigureAwait(false), yarattığım bu yöntemler hangi bir Func<Task> o başlatır zaman uyumsuz yöntem bir kez, biz farklı bir iş parçacığı (önlemek için kilitlenme) ve bekler için tamamlanması:

public static void AwaitTaskSync(Func<Task> action)
{
    Task.Run(async () => await action().ConfigureAwait(false)).Wait();
}

public static TResult AwaitTaskSync<TResult>(Func<Task<TResult>> action)
{
    return Task.Run(async () => await action().ConfigureAwait(false)).Result;
}

public static void AwaitSync(Func<IAsyncAction> action)
{
    AwaitTaskSync(() => action().AsTask());
}

public static TResult AwaitSync<TResult>(Func<IAsyncOperation<TResult>> action)
{
    return AwaitTaskSync(() => action().AsTask());
}

Benim soru şu: bu kod iyi mi sence?

Bazı donanımlar var ya da daha iyi bir yaklaşım biliyorsanız tabii, dinliyorum! :)

CEVAP
18 Mayıs 2013, CUMARTESİ


catch blok dışında mantığıyla hareket ve İstisna sonra, gerekirse, yeniden oluşturma ExceptionDispatchInfo kullanarak yapabilirsiniz.

static async Task f()
{
    ExceptionDispatchInfo capturedException = null;
    try
    {
        await TaskThatFails();
    }
    catch (MyException ex)
    {
        capturedException = ExceptionDispatchInfo.Capture(ex);
    }

    if (capturedException != null)
    {
        await ExceptionHandler();

        capturedException.Throw();
    }
}

Arayan özel StackTrace özellik inceler, bu şekilde, hala TaskThatFails içine atılan nerede olduğunu kaydeder.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dive In

    Dive In

    17 Temmuz 2013
  • Jordie Jordan

    Jordie Jorda

    27 Ocak 2008
  • Pituvision

    Pituvision

    11 Mart 2006