使用异步WCF服务实现接口?

时间:2010-04-14 17:12:00

标签: wcf asynchronous interface

我试图找出是否可以实现.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
}

提前致谢, 约翰

1 个答案:

答案 0 :(得分:2)

显然我误解了原来的问题,即关于如何在客户端代理上使用异步方法。

答案是您从异步方法调用返回。如果可以的话,它不会是异步的。如果您尝试在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);
    }
}