早上。
(尝试这样做):我正在尝试并行执行几个任务。每个任务使用for循环遍历文本文件的特定部分(第1个任务=第1-10行。第二个任务=第11-20行等)。在每次行检查结束时,都会引发一个事件,并且GUI线程会更新UI,即"X行已被检查“。
(卡住):我不知道如何做到这一点,但仍然能够正确地处理异常。据我所知,我需要调用
task.Wait(); 或
task.WaitAll();但是通过调用它,UI线程只是在那里等待,而我在任务中触发的任何更新UI的事件都会被添加到UI的队列中。
有没有人知道怎么解决这个问题?
注意:我提前道歉,如果这是愚蠢的,但我有一些线程的问题。
因为任务将所有异常捆绑到AggregateException中,并且如果我调用task.Waitall(),那么UI线程似乎只是等待任务完成或抛出异常。
发布于 2012-02-29 18:01:19
一种选择是将另一个任务附加到您的任务,作为处理任何异常的“处理程序”。
下面是一个例子:
var task = Task.Factory.StartNew(() =>
{
throw new Exception("oops!");
});
// attach an exception-handling task
task.ContinueWith(previousTask =>
{
// do something with the exception
Console.WriteLine(previousTask.Exception);
}, TaskContinuationOptions.OnlyOnFaulted);请注意,使用ContinueWith附加的任务具有TaskContinuationOptions.OnlyOnFaulted,这意味着只有在附加它的任务抛出异常时,它才会运行。
这样,您的异常就可以被异步处理,并且您不需要等待任何东西。
但是,由于您想要执行并行for循环,我可能会这样做:
Task.Factory.StartNew(() =>
{
try
{
Parallel.For(..., i =>
{
...
});
}
catch (AggregateException e)
{
// handle it somehow
}
});这样,您的主任务将等待所有子任务,但生成它的UI线程不必等待。
您必须确保的主要事情是您的catch子句(或前面示例中的处理任务)从不抛出异常。
发布于 2012-02-29 17:24:13
一种替代方法(最简单的)是在抛出异常的线程中处理异常。
因此,您需要在执行方法中使用try catch -然后您所做的取决于您的设计,例如,您可以引发UI可以处理的错误事件(仍在异常线程的上下文中)。
另一种选择是你可以启动你的任务调度代码(即调用WaitAll()的代码)作为一个BackgroundWorker -这会让UI自由地做自己的事情(处理其他输入)-这可能是更好的方法,但可能需要一点重构。
https://stackoverflow.com/questions/9496416
复制相似问题