2

我有一个使用连接到 WCF 服务的 MEF/Prism 的 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 个参数的通用方法(“开始”方法和“结束”方法)?

4

3 回答 3

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);
        }
    }

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

于 2012-10-05T20:42:07.170 回答
1

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

于 2012-10-05T20:21:47.380 回答
0

似乎您需要一个 WakeUpInstanceResult 类来保存多个参数。

于 2012-10-05T20:20:09.190 回答