繁体   English   中英

UnobservedTaskException可能在哪里发生?

[英]Where could an UnobservedTaskException be occurring?

我有一个访问WCF服务的WPF客户端。 该服务使用计时器很好地运行,每n分钟执行一次处理。 客户端UI具有ProcessNow命令,该命令将覆盖服务的计时器,并立即执行处理。 我正在尝试解决一个可用性问题,其中在处理仍很忙的情况下多次单击“ Process Now按钮时,会从我假设的WCF通讯通道中导致“连接已关闭”异常,然后出现UnobservedTaskException

异常消息说明其原因不是等待任务,就是未访问其Exception属性。 我在解决方案中的任何地方都只有两种明显的Task用途,一种是在视图模型中:

async void ExecuteProcessNowCommand()
{
        await _proxy.ProcessAsync(true);
}

另一个在同一viewmodel中的小型实用程序方法中:

private void ExecuteWithTimeout(Action task, int? timeout = null)
{
    timeout = timeout ?? HostServiceConstants.ServiceControlTimeout;
    var source = new CancellationTokenSource();
    var timedTask = new Task(task, source.Token);
    timedTask.Start();
    bool done = timedTask.Wait(timeout.Value);
    if (!done)
    {
        source.Cancel();
        var frame = new StackFrame(1);
        var methodName = frame.GetMethod().Name;
        _logger.Warn("'{0}' timed out after {1} milliseconds.", methodName, timeout);
    }
}

在第一个代码摘录中,我似乎确实在等待任务,但是根据我在网上某个地方找到的示例,我对第二个更怀疑。 我用它来尝试执行非阻塞检查,例如:

bool CanExecuteProcessNowCommand()
{
    bool result = false;
    ExecuteWithTimeout(() =>
        {

            try
            {
                result = _proxy.CanUserForceProcessing();
            }
            catch (EndpointNotFoundException)
            {
                result = false;
            }
        });
    return result;
}

当我尝试通过以下命令更新命令按钮时,将在WCF客户端中调用最后一段代码:

ProcessNow.RaiseCanExecuteChanged();

我对异步和WCF都是新手,所以请在这里找任何明显的错误。

ExecuteProcessNowCommand不会导致此情况。 如果在异步void方法中引发了未处理的异常,则将删除进程。 事实并非如此。

剩下的只有ExecuteWithTimeout 是的,它可以导致结果UnObservedTaskException如果未处理的异常被抛出timedTask

您正在等待它,正在等待应观察到异常,但是您正在等待超时。 如果通过超时后引发异常,您将看到此行为。

您需要将延续附加到timedTask并观察异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM