早上好!
提前道歉,我确实已经意识到已经问过类似的问题,但是通过这些问题并没有解决我的问题.
在发布异常详细信息之前,这里是一般概述:
我有使用SQL Server(2005和2008r2)进行数据存储的.NET 4.0智能桌面应用程序.在数据库中,我有一个表,用于记录实体何时被更改.这允许应用程序的其他实例检查更改并重新加载某些数据.该表有三个字段:
Id [int], EntityName [nvarchar(4000)], ChangeDateTime [datetime]
Run Code Online (Sandbox Code Playgroud)
Id是主键,ChangeDateTime字段上有一个索引.
为了使这项工作,应用程序以特定间隔检查此表,或者在执行操作时通过检索某个实体的最新更改日期时间并将其与内部存储的值进行比较来查看是否发生了更新.
查询如下所示:
Query: SELECT TOP(@p2) MAX([BondFM].[dbo].[EntityTypeChangedLog].[ChangeDateTime]) AS [ChangeDateTime] FROM [BondFM].[dbo].[EntityTypeChangedLog] WHERE ( [BondFM].[dbo].[EntityTypeChangedLog].[ChangedEntityTypeName] = @p3)
Parameter: @p2 : Int64. Length: 0. Precision: 0. Scale: 0. Direction: Input. Value: 1.
Parameter: @p3 : String. Length: 4000. Precision: 0. Scale: 0. Direction: Input. Value: "SampleEntityName".
Run Code Online (Sandbox Code Playgroud)
因此,该表仅从运行的应用程序接收两个交互:
问题是在执行select语句时我得到以下类型的许多异常:
Message : An exception was caught during the execution of a retrieval query: A transport-level error has occurred when receiving …Run Code Online (Sandbox Code Playgroud) 在处理TPL任务中的异常时,我遇到了两种处理异常的方法.第一个捕获任务中的异常并在结果中返回它,如下所示:
var task = Task<Exception>.Factory.StartNew(
() =>
{
try
{
// Do Something
return null;
}
catch (System.Exception e)
{
return e;
}
});
task.ContinueWith(
r =>
{
if (r.Result != null)
{
// Handle Exception
}
});
Run Code Online (Sandbox Code Playgroud)
第二个是文档中显示的那个,我想正确的做事方式:
var task = Task.Factory.StartNew(
() =>
{
// Do Something
});
task.ContinueWith(
r =>
{
if (r.Exception != null)
{
// Handle Aggregate Exception
r.Exception.Handle(y => true);
}
});
Run Code Online (Sandbox Code Playgroud)
我想知道第一种方法是否有任何问题?我一次又一次地使用这种技术收到了"未处理的聚合异常"异常,并想知道这是怎么发生的?
为了澄清,我认为第二个模式是最好的一个,但我有一段代码,这使得使用第一图案的,我试图找出是否需要重新分解,即如果事实证明,并非所有的异常会被困.