在 Silverlight 4 中,从 UI 线程进行的所有 WCF 调用都必须是异步的。这可以。 WCF 客户端代码公开方法和事件,例如
void GetDataAsync(SomeArgument a);
event EventHandler<GetDataCompletedEventArgs> GetDataCompleted;
是否可以包装它或配置 WCF/Silverlight 来生成以下内容?
void GetDataAsync(SomeArgument a, EventHandler<GetDataCompletedEventArgs>);
在我的项目中,我创建了一个负责所有方法调用的类,该类可供更高层(如 View 模型)访问。它公开了如下方法:
void GetData(SomeArgument a, Action<SomeResult> callback);
现在 serviceClient
是可重用的,因此我需要在调用完成后取消订阅 *Completed 事件。到目前为止我最好的方法是:
EventHandler<T> MakeHandler<T>(Action<T> callback) where T : AsyncCompletedEventArgs
{
return (sender, eventArgs) =>
{
callback(eventArgs); // perform some operations in view model
((Action)eventArgs.UserState)(); // this is to unsubscribe from event
};
}
void GetData(SomeArgument a, Action<SomeResult> callback)
{
var handler = MakeHandler<GetDataCompletedEventArgs>((s, ea) => callback(ea.Result));
serviceClient.GetDataCompleted += handler
serviceClient.GetDataAsync(a, new Action(() => serviceClient.GetDataCompleted -= handler));
}
我真的很想避免为每个使用的 WCF 方法重新键入整个 GetData() 接线,而只需执行以下操作:
void GetData(SomeArgument a, Action<SomeResult> callback)
{
serviceClient.GetDataAsync(a, callback);
}
最佳答案
您可以使用 ServiceClient 的 Service 接口(interface)访问 WCF 服务的开始/结束“.NET 异步模式”。例如,如果您有一个名为“Service1”的 WCF 服务,您的 Silverlight 项目将包含一个“Service1Client”类(使用 Async/Event 模式来公开操作),但它还显式实现一个名为“Service1”的接口(interface),该接口(interface)使用 Begin/每个操作的结束对。使用:-
Service1 service = new Service1Client();
现在,通过访问开始/结束对,事情变得容易一些。您可以使用以下通用函数来创建调用异步模式的基本管道:
public static Action<Action<T>, Action<Exception>> AsyncExecute<T>(Action<AsyncCallback> begin, Func<IAsyncResult, T> end)
{
return (success, fail) =>
{
AsyncCallback cb = (ar) =>
{
try
{
success(end(ar));
}
catch (Exception err)
{
fail(err);
}
};
begin(cb);
};
}
您可以通过特定功能使用它:
void GetData(SomeArgument a, Action<SomeResult> success)
{
var fn = AsyncExecute<SomeResult>(cb => service.BeginGetData(a, cb, null), service.EndGetData);
fn(success, GeneralFail);
}
public static void GeneralFail(Exception err)
{
// General reporting of fail
}
关于c# - 如何简化 Silverlight 4 中的 WCF 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7119850/