Xamarin:从任务中提取的异常不会传播

时间:2014-09-08 17:41:01

标签: c# xamarin.ios xamarin async-await

我在Xamarin中有以下代码(在ios中测试):

private static async Task<string> TaskWithException()
{
    return await Task.Factory.StartNew (() => {
        throw new Exception ("Booo!");
        return "";
    });
}

public static async Task<string> RunTask()
{
    try
    {
        return await TaskWithException ();
    }
    catch(Exception ex)
    {
        Console.WriteLine (ex.ToString());
        throw;
    }
}

将此调用为await RunTask(),会从TaskWithException方法抛出异常,但RunTask中的catch方法永远不会被命中。这是为什么?我希望捕获工作就像在Microsoft的async / await实现中一样。我错过了什么吗?

1 个答案:

答案 0 :(得分:6)

你不能await constructor内的方法,这就是为什么你无法抓住Exception

要抓住Exception,您必须await操作。

我有两种方法从构造函数中调用异步方法:

1。 ContinueWith解决方案

RunTask().ContinueWith((result) =>
{
    if (result.IsFaulted)
    {
        var exp = result.Exception;
    }      
});

2。 Xamarin表格

Device.BeginInvokeOnMainThread(async () =>
{
    try
    {
        await RunTask();    
    }
    catch (Exception ex)
    {
        Console.WriteLine (ex.ToString());
    }    
});

3。 iOS

InvokeOnMainThread(async () =>
{
    try
    {
        await RunTask();    
    }
    catch (Exception ex)
    {
        Console.WriteLine (ex.ToString());
    }    
});