任务上未处理的AggregateException在另一个操作系统上抛出的持续时间

时间:2012-07-27 13:07:36

标签: c# wcf task-parallel-library continuations aggregateexception

我在winForms应用程序中遇到一个奇怪的行为,同时测试它是如何响应不同的操作系统的。

长时间运行的操作,其中抛出未处理的AggregateException(在XP 32位机器上测试时)是WCF的一部分(使用basicHttpBindingStreamed传输模式)客户端更新过程。该结构类似于以下代码段。为清楚起见,我已经省略了WCF异常处理:

var tsUIthread = TaskScheduler.FromCurrentSynchronizationContext();
int filesCount = 0;
List<MessageContract> files;

private void Update()
{
    var cTokenDownloadFiles = new CancellationTokenSource();
    var cTokenUpdateDatabases = new CancellationTokenSource();

    var task1CheckForNewFiles = Task.Factory.StartNew(() => 
    {
        filesCount = proxy.GetFiles();
        If(filesCount == 0)
        {
            cTokenDownloadFiles.Cancel();
            cTokenUpdateDatabases.Cancel();
        }
        else
            files = new List<MessageContract>();
    });


    var task2UpdateControls = task1CheckForNewFiles.ContinueWith(result => 
    {
        UpdateControlsBeforeDownload();

    }, CancellationToken.None, TaskContinuationOptions.None, tsUIthread);


    var task3DownloadFiles = task2.ContinueWith(result => 
    {
        for(int i = 0; i< filesCount; i++)
        {
            try
            {
                files.Add(proxy.DownloadFile());
            }
            catch(IOException)
            {
                cTokenUpdateDatabases.Cancel();
                Task.Factory.StartNew(() => ResetControls, 
                    CancellationToken.None, TaskCreationOptions.None, tsUIthread);
                retryUpdateTimer.Start(); // System.Windows.Forms.Timer
                return;
            }
        }    

    }, cTokenDownloadFiles.Token);


    var task4UpdateDatabases = task3DownloadFiles.ContinueWith(result =>
    {            
        UpdateDatabases();

    },cTokenUpdateDatabases.Token);


    var task5UpdateControls = task4UpdateDatabases.ContinueWith(result =>
    {
        UpdateControlsOnUpdateFinished();

    }, CancellationToken.None, TaskContinuationOptions.None, tsUIthread);

}

您会注意到我将proxy.DownloadFile()方法包装在try-catch块中,我正在捕获IO.IOException。正如我在帖子的开头所说的那样,我的WCF服务使用Streamed的{​​{1}}传输模式,所以当出于某种原因与服务器的连接丢失之后,我需要捕获这种类型的异常。行动已经开始。我所做的全部在catch语句中,取消数据库更新任务,将UI控件重置为其主值,并启动System.Windows.Forms.Timer,执行basicHttpBinding几秒钟Interval执行Update()如果客户端具有互联网连接,则再次使用方法。

虽然这个整个过程在我的开发环境(Windows7 32位机器)上按预期工作时抛出IOException,但是当我在Windows XP 32位机器上测试我的winforms应用程序时,未处理AggregateException at { {1}}终止应用程序。

有没有人经历过类似的事情?如何才能在XP机器上抛出异常?我还没有在其他环境中测试它。 实际的代码包含更多的任务和延续,调用下游业务组件,当涉及到使用continuation spaghetti的Task异常处理时,我有点迷失。你能给我一些我应该如何构建异常处理的例子吗?

0 个答案:

没有答案