簡體   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