我有一个 WCF 服务,它使用回调合同来通知客户端,类似于这个
public interface IClientCallback
{
[OperationContract(IsOneWay = true)]
void NotifySomething();
}
和调用它的服务代码与此类似
void NotifySomething()
{
try
{
this.callback.NotifySomething();
}
catch (Exception ex)
{
// Log the exception and eat it
}
}
请注意,根据设计,回调通知是可选的,即很高兴拥有,但不是必需的。这就是为什么它被标记为OneWay
并且实现吃异常。
由于一些误解,我们认为拥有一个非阻塞的火和忘记方法就足够了。但当然这不是真的,所以在某些情况下它会阻塞一段时间,这会导致问题,因为它是从线程同步块内部调用的。所以我们决定通过如下改变定义使其异步
public interface IClientCallback
{
[OperationContract(IsOneWay = true)]
Task NotifySomething();
}
我对客户端实现没有问题,我的问题是如何从服务中调用它。这是我想做的
async void NotifySomething()
{
try
{
await this.callback.NotifySomething();
}
catch (AggregateException ex)
{
// Unwrap, log the exception(s) and eat it
}
catch (Exception ex)
{
// Log the exception and eat it
}
}
现在,既然大家都说async void
这不是一个好习惯,那么在这里使用它可以吗?我还有什么其他选择?在 WCF 服务上下文中执行此操作的推荐方法是什么?