首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用异常处理执行任务,同时在任务期间更新GUI

使用异常处理执行任务,同时在任务期间更新GUI
EN

Stack Overflow用户
提问于 2012-02-29 17:20:41
回答 2查看 523关注 0票数 0

早上。

(尝试这样做):我正在尝试并行执行几个任务。每个任务使用for循环遍历文本文件的特定部分(第1个任务=第1-10行。第二个任务=第11-20行等)。在每次行检查结束时,都会引发一个事件,并且GUI线程会更新UI,即"X行已被检查“。

(卡住):我不知道如何做到这一点,但仍然能够正确地处理异常。据我所知,我需要调用

代码语言:javascript
复制
task.Wait();  

代码语言:javascript
复制
task.WaitAll();

但是通过调用它,UI线程只是在那里等待,而我在任务中触发的任何更新UI的事件都会被添加到UI的队列中。

有没有人知道怎么解决这个问题?

注意:我提前道歉,如果这是愚蠢的,但我有一些线程的问题。

因为任务将所有异常捆绑到AggregateException中,并且如果我调用task.Waitall(),那么UI线程似乎只是等待任务完成或抛出异常。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-29 18:01:19

一种选择是将另一个任务附加到您的任务,作为处理任何异常的“处理程序”。

下面是一个例子:

代码语言:javascript
复制
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循环,我可能会这样做:

代码语言:javascript
复制
Task.Factory.StartNew(() =>
{
    try 
    {
        Parallel.For(..., i => 
        {
            ... 
        });
    }
    catch (AggregateException e)
    {
        // handle it somehow
    }
});

这样,您的主任务将等待所有子任务,但生成它的UI线程不必等待。

您必须确保的主要事情是您的catch子句(或前面示例中的处理任务)从不抛出异常。

票数 1
EN

Stack Overflow用户

发布于 2012-02-29 17:24:13

一种替代方法(最简单的)是在抛出异常的线程中处理异常。

因此,您需要在执行方法中使用try catch -然后您所做的取决于您的设计,例如,您可以引发UI可以处理的错误事件(仍在异常线程的上下文中)。

另一种选择是你可以启动你的任务调度代码(即调用WaitAll()的代码)作为一个BackgroundWorker -这会让UI自由地做自己的事情(处理其他输入)-这可能是更好的方法,但可能需要一点重构。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9496416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档