制作此异步方法的通用版本

时间:2012-10-05 20:15:10

标签: c# wcf asynchronous silverlight-4.0 prism

我有一个使用MEF / Prism连接到WCF服务的Silverlight客户端。我正在编写一个“服务代理”,以便在整个应用程序中用作共享服务。这个“服务代理”是一个单例,它为客户端提供了调用WCF服务的唯一方法。我已经实现了我的服务合同,除了他们调用的特定Begin / End操作和他们接受的参数外,所有方法都非常相似。

例如:

public void WakeUpInstanceAsync(Foo opportunity, bool isHistorical, Action<WakeupObj> callback)
{
    if (IsOpen())
    {
        AsyncCallback asyncCallback = (e) =>
        {
            _currentDispatcher.BeginInvoke(() =>
            {
                try
                {
                    callback(_funnelClient.EndWakeUpInstance(e));
                }
                catch (CommunicationException ex1)
                {
                    // Notify someone via eventaggregator?
                    callback(null);
                }
            });
        };

        _funnelClient.BeginWakeUpInstance(opportunity, isHistorical, asyncCallback, null);
    }
}

有什么方法可以创建一个带有2个参数的通用方法(“begin”方法和“end”方法)?

3 个答案:

答案 0 :(得分:2)

这样的事情会是你想要的吗?

    public void WakeUpInstanceAsync(Foo opportunity, bool isHistorical, Action<WakeupObj> callback)
    {
        this.ImplementAsyncMethod(
            asyncCallback => _funnelClient.BeginWakeUpInstance(opportunity, isHistorical, asyncCallback, null),
            asyncResult => _funnelClient.EndWakeUpInstance(asyncResult),
            callback);
    }

    public void ImplementAsyncMethod<T>(Action<AsyncCallback> begin, Func<IAsyncResult, T> end, Action<T> callback)
    {
        if (IsOpen())
        {
            AsyncCallback asyncCallback = (e) =>
            {
                _currentDispatcher.BeginInvoke(() =>
                {
                    try
                    {
                        callback(end(e));
                    }
                    catch (CommunicationException ex1)
                    {
                        // Notify someone via eventaggregator?
                        callback(default(T));
                    }
                });
            };

            begin(asyncCallback);
        }
    }

(免责声明 - 我还没编译过它)

答案 1 :(得分:1)

您可以使用TaskFactory.FromAsync将几乎所有Begin / End异步方法对包装到Task<T>中。这为使用异步编程提供了一个更清晰的模型,因为您可以在UI线程上使用延续来进行“回调”。

答案 2 :(得分:0)

好像你需要一个WakeUpInstanceResult类来保存多个参数。