从WCF服务中调用基于任务的异步单向回调方法我有一个WCF服务,它使用回调契约来通知客户端,类似这个公共接口IClientCallback{[OperationContract(IsOneWay=true)]voidNotifySomething();}和调用它的服务代码类似于此voidNotifySomething(){try{this.callback.NotifySomething();}catch(Exceptionex){//Logtheexceptionandeatit}}请注意,回调通知在设计上是可选的,即很好,但不是必需的。这就是为什么它被标记为OneWay并且实现会吃掉异常。由于一些误解,我们认为有一个非阻塞的fireandforget方法就足够了。但当然那不是真的,所以在某些情况下它会阻塞一段时间,这会导致问题,因为它是从内部线程同步块中调用的。所以我们决定通过如下更改定义使其异步publicinterfaceIClientCallback{[OperationContract(IsOneWay=true)]TaskNotifySomething();我对客户端实现没有问题,我的问题是如何从服务中调用它。这就是我的想法asyncvoidNotifySomething(){try{awaitthis.callback.NotifySomething();}catch(AggregateExceptionex){//展开,记录异常并吃掉它}catch(Exceptionex){//记录异常并吃掉它}}现在,既然每个人都说asyncvoid不是一个好习惯,可以在这里使用吗?我还有哪些其他选择?在WCF服务的上下文中执行此操作的推荐方法是什么?您编写它的方式非常安全,因为它可以处理异常。您还可以编写可重用的扩展方法来执行此操作,这样您就不需要重复它。大概是这样的:以上就是C#学习教程:从WCF服务调用基于任务的异步单向回调方法。如果对大家有用,需要了解更多C#学习教程,希望大家多多关注——publicstaticclassExtensions{publicstaticvoidFireAndForget(thisTasktask){task.ContinueWith(t=>{//记录异常t.Exception.Handle((ex)=>{Console.WriteLine(ex.Message);returntrue;});},TaskContinuationOptions.OnlyOnFaulted);}}publicasyncTaskFailingOperation(){awaitTask.Delay(2000);抛出新的异常(“错误”);}voidMain(){FailingOperation().FireAndForget();控制台.ReadLine();}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
