silverlight   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了使用Rx简化异步Silverlight Web服务请求大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我使用Rx为我的WCF Web服务编写了一个简化的Silverlight客户端库,但是有时我注意到我缺少已完成的事件. public IObservable<XElement> GetReport(String reportName) { return from client in Observable.Return(new WebserviceClient()) f
我使用Rx为我的WCF Web服务编写了一个简化的Silverlight客户端库,但是有时我注意到我缺少已完成的事件.

public IObservable<XElement> GetReport(String reportName)
{
    return from client in Observable.Return(new WebserviceClient())
           from request in Observable.ToAsync<String>(client.GetReportDataAsynC)(reportName)
           from result in Observable.FromEvent<GetReportDataCompletedEventArgs>(client,"GetReportDataCompleted").Take(1)
           from close in this.CloseClient(client)
           SELEct result.EventArgs.Result;
}

我认为问题是由于Web服务被调用并在订阅已完成的事件之前返回.我无法弄清楚如何让Rx在异步调用之前订阅该事件.我试过StartWith,但这需要输入和输出类型相同,任何想法?

@H_404_16@解决方法
似乎最好的答案是使用Observable.CreateWithDisposable()

例如

public IObservable<XElement> GetReport(String reportName)
{
    return from client in Observable.Return(new WebserviceClient())
            from completed in Observable.CreateWithDisposable<GetReportDataCompletedEventArgs>(observer =>
                {
                    var subscription = Observable.FromEvent<GetReportDataCompletedEventArgs>(client,"GetReportDataCompleted")
                        .Take(1)
                        .SELEct(e => e.EventArgs)
                        .Subscribe(observer);
                    client.GetReportDataAsync(reportName);
                    return subscription;
                })
            from close in this.CloseClient(client)
            SELEct completed.Result;
}

为了使这更容易使用,我将CreateWithDisposable重构为一个可以与我的所有Web服务调用一起使用的公共函数,包括从事件args类型自动确定事件名称

private IObservable<T> Callservice<T>(ICommunicationObject serviceClient,Action start) where T : AsyncCompletedEventArgs
{
    if (typeof(T) == typeof(AsyncCompletedEventArgs))
    {
        throw new InvalidoperationException("Event arguments type cAnnot be used to determine event name,use event name overload instead.");
    }

    String completedEventName = typeof(T).Name.TrimEnd("EventArgs");
    return Callservice<T>(serviceClient,start,completedEventName);
}

private IObservable<T> Callservice<T>(ICommunicationObject serviceClient,Action start,String completedEventName) where T : AsyncCompletedEventArgs
{
    return Observable.CreateWithDisposable<T>(observer =>
    {
        var subscription = Observable.FromEvent<T>(serviceClient,completedEventName).Take(1).SELEct(e => e.EventArgs).Subscribe(observer);
        start();
        return subscription;
    });
}

// Example usage:
public IObservable<XElement> GetReport(String reportName)
{
    return from client in Observable.Return(new WebserviceClient())
            from completed in this.Callservice<GetReportDataCompletedEventArgs>(client,() => client.GetReportDataAsync(reportName))
            from close in this.CloseClient(client)
            SELEct completed.Result;
}

/// <sumMary>
/// Asynchronously closes the web service client
/// </sumMary>
/// <param name="client">The web service client to be closed.</param>
/// <returns>Returns a cold observable sequence of a single success Unit.</returns>
private IObservable<AsyncCompletedEventArgs> CloseClient(WebserviceClient client)
{
    return this.Callservice<AsyncCompletedEventArgs>(client,client.CloseAsync,"CloseCompleted");
}

希望这有助于其他人!

@H_450_48@

大佬总结

以上是大佬教程为你收集整理的使用Rx简化异步Silverlight Web服务请求全部内容,希望文章能够帮你解决使用Rx简化异步Silverlight Web服务请求所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。