我在winForms应用程序中遇到一个奇怪的行为,同时测试它是如何响应不同的操作系统的。
长时间运行的操作,其中抛出未处理的AggregateException
(在XP 32位机器上测试时)是WCF的一部分(使用basicHttpBinding
和Streamed
传输模式)客户端更新过程。该结构类似于以下代码段。为清楚起见,我已经省略了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异常处理时,我有点迷失。你能给我一些我应该如何构建异常处理的例子吗?