Как реализовать интерфейс возвращает IAsyncResult с пустым телом метода - PullRequest
0 голосов
/ 24 января 2019

WCF нужно, чтобы я реализовал такие методы, как IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state), если я хочу наследовать ChannelBase. Поскольку мне нечего делать, когда канал открывается, я бы предпочел оставить тело этого метода пустым. Что я должен вернуть как IAsyncResult в этих пустых методах?

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Разрешено добавлением реализации 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;
}
0 голосов
/ 24 января 2019

Как правило, у вас не должно быть пустых методов вообще. Если у ChannelBase есть абстрактный метод, который вам не нужен, вы должны либо предоставить разумное переопределение, даже если он вам сейчас не нужен, либо выбросить из него NotSupportedException, где Сообщение об исключении объясняет, почему этот метод не поддерживается:

public override IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state) 
{
    throw new NotSupportedException("OnBeginOpen is not supported because...");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...