Реализация интерфейса с использованием асинхронной службы WCF? - PullRequest
1 голос
/ 14 апреля 2010

Я пытаюсь выяснить, возможно ли реализовать интерфейс .NET, где метод интерфейса должен что-то возвращать, а вы реализуете этот конкретный метод интерфейса с помощью асинхронной службы WCF?

Надеюсь, вы уже увидели проблему, с которой я столкнулся.

Вот интерфейс:

    public interface IDataService
    {
        IDataServiceResponse SendDataRequest();
    }

IDataServiceResponse должен представлять собой простой контейнер, который содержит результат моего асинхронного обратного вызова WCF.

Вот фрагмент кода, в котором я реализую метод интерфейса SendDataRequest ()

        public IDataServiceResponse SendDataRequest()
        {
            InitializeDataServiceParameters();

            // Call the web service asynchronously, here....
            _client.BeginQueryJobs(_parameters, DataServiceQueryCallBack,  _client);

            // How do I return _dataServiceResponse, if I am calling the WCF service
            // asynchronously??

            return _dataServiceResponse;
        }

И подпись метода обратного вызова:

void DataServiceQueryCallBack(IAsyncResult result)
{
  // ... implementation code
}

Заранее спасибо, John

1 Ответ

2 голосов
/ 14 апреля 2010

Очевидно, я неправильно понял исходный вопрос, который касался использования асинхронных методов на клиентском прокси.

Ответ в том, что вы не возвращаетесь из асинхронного вызова метода. Это не было бы асинхронным, если бы вы могли. Если вы пытаетесь инкапсулировать асинхронный метод в клиенте WCF, то вместо возвращаемого значения следует инкапсулировать обратный вызов:

public interface IDataService
{
    void SendDataRequest(Action<IDataServiceResponse> callback);
}

public class DataService
{
    public void SendDataRequest(Action<IDataServiceResponse> callback)
    {
        InitializeDataServiceParameters();
        _client.BeginQueryJobs(_parameters, DataServiceQueryCallBack, callback);
    }

    private void DataServiceQueryCallBack(IAsyncResult result)
    {
        var response = _client.EndQueryJobs(ar);
        // Convert the actual WCF response into your custom interface
        var dataServiceResponse = TranslateResponse(response);
        Action<IDataServiceResponse> callback = 
            (Action<IDataServiceResponse>)result.AsyncState;
        if (callback != null)
            callback(dataServiceResponse);
    }
}
...