记一次Task和WCF的特别情况

2019-09-29  本文已影响0人  Imjeef

Task

.NET中异步编程的Task对象。
在.NET4中,Task任务结束,如果内部产生了异常 ,当GC回收Task时,会抛出AggregateException的异常。
发现这个错误在Win10系统不会产生,而在Win7系统中则会抛出异常,Win7 .NET的版本是4.0

产生这个不同原因是4.5以及后续的版本为了更好的优化异步编程。更改了Task异常默认处理行为。
Task在4.5之后Task内部异常不会抛出,而是作为Task的Result返回。

所以在.NET4.0使用需要注意手工处理异常

方法一:

Task.Factory.StartNew(()=>{
  try{
    //异步执行逻辑
  }catch(Exception ex){
    //对异常进行处理
  }
});

方法二:

var taskResult = Task.Factory.StartNew(()=>{
  //异步执行逻辑
});
try{
  task.Wait();
}catch(Exception ex){
  //对异常进行处理
}

方法三:
重写任务计划的UnobservedTaskException事件,将引发的异常设置为“已观察到”

TaskScheduler.UnobservedTaskException+=(sender, unobservedTaskExceptionEventArgs)=>{
  //设置为已观测到异常,阻止默认的一行处理行为
  unobservedTaskExceptionEventArgs.SetObserved();
};

WCF

WCF中双工通信的疑问,在双工通信的模型中,如果频繁调用的情况下,会导致客户端阻塞。
换成同步调用则没发现这个问题

WCF服务实现都是同样的每次设置Callback,多线程模式

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)]
上一篇 下一篇

猜你喜欢

热点阅读