Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尽管等待任务并捕获异常,但未观察到的异常仍被重试_C#_.net_Exception_Xamarin.ios_Async Await - Fatal编程技术网

C# 尽管等待任务并捕获异常,但未观察到的异常仍被重试

C# 尽管等待任务并捕获异常,但未观察到的异常仍被重试,c#,.net,exception,xamarin.ios,async-await,C#,.net,Exception,Xamarin.ios,Async Await,我的代码捕获服务器调用引发的所有异常,如下所示: new public Task SaveAsync() { return ServerException.Wrap(base.SaveAsync); } try { await problem.SaveAsync(); } catch (ServerException ex) {

我的代码捕获服务器调用引发的所有异常,如下所示:

    new public Task SaveAsync()
    {
        return ServerException.Wrap(base.SaveAsync);
    }
        try
        {
            await problem.SaveAsync();
        }
        catch (ServerException ex)
        {
            Logger.LogException("Error saving problem.", ex);
        }
其中ServerException.Wrap看起来像:

    public static async Task<T> Wrap<T>(Func<Task<T>> func)
    {
        try
        {
            return await func();
        }
        catch (Exception ex)
        {
            // This is an internal error that shouldn't happen.
            throw new ServerException(ex);
        }
    }

    public static async Task Wrap(Func<Task> func)
    {
        await Wrap(async () =>
            {
                await func();
                return true;
            });
    }
我有一个内部错误,它生成了一个异常,我在上面的一行中捕获到该异常,然后它被记录如下:

    new public Task SaveAsync()
    {
        return ServerException.Wrap(base.SaveAsync);
    }
        try
        {
            await problem.SaveAsync();
        }
        catch (ServerException ex)
        {
            Logger.LogException("Error saving problem.", ex);
        }
2015-10-20 11:20:44.502[第99行]错误保存问题。(例外情况: Exceptions.ServerException:-->System.ArgumentException:一个项目 已添加具有相同密钥的。位于 System.ThrowHelper.ThrowArgumentException(例外资源) [0x00000]英寸 /Users/builder/data/lanes/1977/2c66d2fe/source/mono/external/referencesource/mscorlib/system/throwhelper.cs:74

但几秒钟后,我收到一条未经处理的异常警告,该警告已被记录:

2015-10-20 11:21:16.352警告:未处理的异常: System.AggregateException:未观察到任务的异常 通过等待任务或访问其Exception属性 结果,未观察到的异常被终结器重新调用 线程。-->System.ArgumentException:具有相同键的项具有 已添加。位于System.ThrowHelper.ThrowArgumentException (例外资源)[0x00000]位于 /Users/builder/data/lanes/1977/2c66d2fe/source/mono/external/referencesource/mscorlib/system/throwhelper.cs:74

为什么我会得到第二个未观察到的异常,即使我正在捕获并处理第一个异常?这个异常似乎是由我的ServerException.Wrap方法引发的


我使用的是MonoTouch。

您需要将异常显式设置为“已观察”

为此,您需要订阅
TaskScheduler
unobservedtaskeexception
事件,并将其显式设置为
observed
(对其调用SetObserved()

请看这里:

编辑: 当然,您也可以捕获
aggregateeexception
,或者使用ContinueWith()观察并恢复任务

见官方文件的底部:


为什么一开始就不注意它?你确定这是所有相关的代码吗?这是简化版。你还需要代码的哪些部分?不等待任务的部分:)SaveAsync的外观如何?@KostubDeshmukh:请发布最小的、可复制的代码。这样我们也可以看到错误。我在MonoTouch上也遇到了类似的问题。你找到解决这个问题的办法了吗?