线程池线程抛出的异常显示为未处理
Exception Thrown from Thread Pool Thread shown as Unhandled
我正在通过以下方法在后台线程池线程上启动任务
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(...)
时,我收到 expected TimeoutException
,VS2012 抛出 "a TimeoutException was unhandled by user code" 消息,当很明显我正在以正确的方式处理 "continuation" 中的异常。如果我继续而不是中断,异常确实被捕获并且我得到了我预期的错误消息。我只是不确定为什么 VS2012 告诉我异常未处理?
我基本上是在做 Jon Skeets 的回答中清楚描述的事情。
感谢您的宝贵时间。
您已启用 "Just My Code"(我在您引用的其他问题的回答中提到了这一点)。调试器指示 "User code"(您的代码)没有处理异常——这是真的。异常被框架代码捕获并放入任务中。
关闭 "Just My Code" 调试器设置(在我看来,这是一个只会引起混乱并且用处非常有限的功能)。
我正在通过以下方法在后台线程池线程上启动任务
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(...)
时,我收到 expected TimeoutException
,VS2012 抛出 "a TimeoutException was unhandled by user code" 消息,当很明显我正在以正确的方式处理 "continuation" 中的异常。如果我继续而不是中断,异常确实被捕获并且我得到了我预期的错误消息。我只是不确定为什么 VS2012 告诉我异常未处理?
我基本上是在做 Jon Skeets 的回答中清楚描述的事情。
感谢您的宝贵时间。
您已启用 "Just My Code"(我在您引用的其他问题的回答中提到了这一点)。调试器指示 "User code"(您的代码)没有处理异常——这是真的。异常被框架代码捕获并放入任务中。
关闭 "Just My Code" 调试器设置(在我看来,这是一个只会引起混乱并且用处非常有限的功能)。