[英]How to implement an interface returns IAsyncResult with empty method body
如果我想继承ChannelBase
IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state)
WCF需要我实现像IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state)
这样的方法。 当频道被打开时我无事可做,我宁愿把那个方法体留空。 我应该在那些空方法中作为IAsyncResult
返回什么?
解决方法:将IAsyncResult实现添加为已完成的异步结果
internal class CompletedAsyncResult : IAsyncResult
{
public CompletedAsyncResult(object state)
{
this.AsyncState = state;
}
public object AsyncState { get; set; }
public WaitHandle AsyncWaitHandle => new ManualResetEvent(true);
public bool CompletedSynchronously => true;
public bool IsCompleted => true;
}
并使用像
protected override IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state)
{
var result = new CompletedAsyncResult(state);
callback?.Invoke(result);
return result;
}
根据经验,你根本不应该有空的方法。 如果ChannelBase
有一个你不需要的抽象方法,你应该提供合理的覆盖,即使你现在不需要它,或者从中抛出NotSupportedException
,异常消息解释了为什么不支持这种方法:
public override IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state)
{
throw new NotSupportedException("OnBeginOpen is not supported because...");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.