从线程池线程抛出的异常显示为未处理

时间:2015-02-18 10:34:19

标签: c# exception task-parallel-library async-await

我正在通过以下方法启动后台线程池线程上的任务

private async Task LoadCoreMatchDataAsync()
{
    string errorMessage = String.Empty;
    ...
    try
    {
        if (!HasConnection)
            return;

        IProgress<string> progressIndicator = new Progress<string>(LoadProgress);
        EventsCollection = new BindableCollection<Taurus.MatchDetails>(
            await MatchDataService.GetCollectionAsync(
                this.client, progressIndicator, this.token));
        ...
    }
    catch (TimeoutException toe)
    {
        errorMessage = String.Format(
            "Retrieval of the MatchDetails using connection " +
            "\"{0}\" failed with the following TimeoutException: \"{1}\".",
            this.ConnectionString,
            toe.Message);
    }
    catch (OperationCanceledException)
    {
        // Do nothing, cancel silently.
    }

    // Display any errors.
    if (!String.IsNullOrEmpty(errorMessage))
    {
        await dialogManager.ShowDialog<MessageDialogResult>(
            new MessageBoxViewModel("Connection Timeout", errorMessage, mbs));
        HasConnection = false;
    }
}

GetCollectionAsync(...)方法

public async Task<BindableCollection<Taurus.MatchDetails>> GetCollectionAsync(
    MongoClient client, IProgress<string> progressIndicator, CancellationToken token)
{
    return await Task.Factory.StartNew<BindableCollection<Taurus.MatchDetails>>(() =>
        {
            ... // Somewhere in here we get a TimeoutException thrown. 
        }, token);
}

问题在于,当我打电话给await MatchDataService.GetCollectionAsync(...)时,我得到预期的 TimeoutException,VS2012抛出&#34; TimeoutException未被用户代码&#34;处理消息,当我清楚地处理&#34;继续&#34;中的异常时以正确的方式。如果我继续而不是中断,异常确实被捕获,我得到了我预期的错误消息。我只是不确定为什么VS2012告诉我异常是未处理的?

我基本上正在做Jon Skeets答案中明确描述的内容https://stackoverflow.com/a/19865613/626442

感谢您的时间。

1 个答案:

答案 0 :(得分:1)

你有&#34;只是我的代码&#34;打开(我在你提到的另一个问题的答案中提到过)。调试器指示&#34;用户代码&#34; (您的代码)没有处理异常 - 这是真的。该异常由框架代码捕获并放入任务。

关闭&#34; Just My Code&#34;调试器设置(在我看来,这是一个仅引起混淆且功能非常有限的功能)。