我有一个使用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”方法)?
答案 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类来保存多个参数。