c# - 如何简化 Silverlight 4 中的 WCF 调用

标签 c# .net wcf silverlight-4.0 delegates

在 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/

相关文章:

c# - 了解 WCF ServiceBehaviorProperty ConcurrencyMode

wcf.js模块从nodejs访问wcf服务

c# - ModalPopupExtender 奇怪行为中的 Gridview 分页

c# - 每次按键仅允许 1 个值

c# - 在 Microsoft Sync Framework 中获取更改摘要

c# - 在运行时使用 jQuery 将 JavaScript 注入(inject) WebBrowser

c# - .NET 的通用性能测试框架

c# - Asp.Net MVC 5 - 自定义授权不起作用?

c# - 让事件符合 Net 指南有什么好处?

c# - WCF 客户端错误 : "The address of the security token issuer is not specified"