Ben*_*ual 4 c# wpf .net-4.0 task-parallel-library
我正在测试在我的应用程序中使用Task.现在,我做了以下事情:
var task = Task.Factory.StartNew(() => {
// long running process
throw new Exception("test"); // throwing TestException
});
task.ContinueWith(x => MyErrorHandler(task.Exception), TaskContinuationOptions.OnlyOnFaulted);
void MyErrorHandler(Exception error) {
MessageBox.Show(error.Message);
}
Run Code Online (Sandbox Code Playgroud)
这个想法是,将执行长时间运行的进程,用户可以在不阻止UI的情况下继续工作.如果出现问题(异常),则在长时间运行的过程完成后将显示(在正常情况下,没有异常)
这是我使用它的正确方法还是我必须以另一种方式进行?有没有问题,我可以通过这种方式获得,现在我看不到?
这将在您明确检查时起作用,Task.Exception这将防止异常被忽视.
我会在这里提出一些建议.
首先,如果这确实是一个长期运行的任务,您可能需要指定:
var task = Task.Factory.StartNew(() => {
// long running process
throw new Exception("test"); // throwing TestException
}, TaskCreationOptions.LongRunning);
Run Code Online (Sandbox Code Playgroud)
其次,你不需要关闭task:
// use x.Exception, since x is the task
task.ContinueWith(x => MyErrorHandler(x.Exception), TaskContinuationOptions.OnlyOnFaulted);
Run Code Online (Sandbox Code Playgroud)
您可能还希望在主线程上运行此操作,特别是如果您决定要使用更精细的(在您的UI中)进行报告:
// This will work if MyErrorHandler uses a UI control, since it'll marshal back to the current synchronization context
task.ContinueWith(x => MyErrorHandler(x.Exception),
CancellationToken.None,
TaskContinuationOptions.OnlyOnFaulted,
TaskScheduler.FromCurrentSynchronizationContext());
Run Code Online (Sandbox Code Playgroud)
(只有在错误处理程序中使用UI控件等时才需要这样做.)
此外 - 如果您使用的是.NET 4.5或.NET 4的异步目标包,则可以使用新的async/ awaitsupport 来简化此操作.如果您将方法标记为async,则可以执行以下操作:
try
{
await Task.Factory.StartNew(() => {
// long running process
throw new Exception("test"); // throwing TestException
}, TaskCreationOptions.LongRunning);
}
catch(Exception error)
{
MyErrorHandler(error);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1677 次 |
| 最近记录: |