silverlight   发布时间:2022-05-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了.net – Silverlight 4.0和WCF客户端代理 – 如何创建和如何关闭实例大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

Silverlight WCF服务代理生命周期的主题对我来说不是很清楚。我已经阅读各种材料,资源,答案在这里,但我仍然不完全理解的假设最好的方式使用它们。 我目前在Silverlight 4.0中使用自定义二进制绑定。 在silverlight中创建代理是一个昂贵的操作吗? 我们应该尝试在代码中共享代理实例还是创建新的更好? 如果我们做共享,如果多线程访问它,我们应该锁定吗? 因为代理上的错误会错
Silverlight WCF服务代理生命周期的主题对我来说不是很清楚。我已经阅读各种材料,资源,答案在这里,但我仍然不完全理解的假设最好的方式使用它们。

我目前在Silverlight 4.0中使用自定义二进制绑定。

在silverlight中创建代理是一个昂贵的操作吗?
我们应该尝试在代码中共享代理实例还是创建新的更好?
如果我们做共享,如果多线程访问它,我们应该锁定吗?

因为代理上的错误错误代理的状态我认为共享代理不是一个好主意,但我读到,创作是昂贵的,所以它不是100%清楚在这里做什么。

结束 – silverlight WCF服务客户端只提供CloseAsync方法。代理需要在关闭时使用某些逻辑(如果它们出现故障,我们应该调用在Silverlight中同步的Abort(),如果不是,我们应该将CloseAsync设置为不同步或什么?

在许多官方的Silverlight样本从MS代理没有关闭,只是材料的缺陷或预期的方法吗?

主题对我非常重要,我想要清楚地了解我目前没有的所有应该虑的事情。

(我确实看到这个问题What is the proper life-cycle of a WCF service client proxy in Silverlight 3?似乎接近我的,但我不能说我对质量的答案感到满意)

我真的想看看使用,创建,关闭等WCF代理的示例代码,最重要的是,解释为什么这是最好的方法。我也认为(目前相信),由于问题的性质,应该有一个单一的,一般使用最佳实践/模式 – 使用(创建,重用,关闭)WCF代理在Silverlight中的方法

解决方法

摘要:我相信最好的做法是在您即将使用它时实例化您的Web服务客户端,然后让它超出范围并获取垃圾回收。这反映在您看到的来自Microsoft的示例中。说明如下…

完整:我发现的过程的最好的完整描述是在How to: Access a Service from Silverlight.这里的例子显示了实例化Web服务客户端并允许它超出范围(不需要关闭它)的典型模式。 Web服务客户端继承自ClientBase,它具有Finalize方法,当对象被垃圾回收时,如果需要,应释放任何非托管资源。

我有一个体面的使用Web服务的经验,我使用代理和实例化它们在使用前,然后允许他们被垃圾收集。我从来没有这个方法的问题。我阅读Wenlong Dong’s Blog,其中说代理的创建是昂贵的,但即使他说性能改进了.NET 3.5(也许它已经改善了自那以后?)。我可以告诉你的是,性能一个相对术语,除非你的数据被检索小于平凡,除了创建连接,花费在序列化/反序列化和传输更多的时间。这当然是我的经验,你最好先在这些领域进行优化。

最后,由于我认为我的意见可能不够,我写了一个快速测试。我使用Visual Web Developer 2010 Express提供的模板创建了一个启用Silverlight的Web服务(使用一个名为DoWork()的认void方法)。然后在我的示例Silverlight客户端,我调用它使用以下代码

int counter=0;
public void test()
{
    serviceReference1.service1Client client = new serviceReference1.service1Client();
    client.DoWorkCompleted += (obj,args) => 
    { 
        counter++;
        if (counter > 9999)
        {
            for(int j=0;j<10;j++) GC.Collect();
            System.Windows.messageBox.Show("Completed");
        }
    };
    client.DoWorkAsync();
}

然后我使用for(int i = 0; i <10000; i)test();并启动应用程序。它花了一点点20秒钟来加载应用程序&完成Web服务调用(全部10,000个)。当Web服务调用时,我看到进程的内存使用量跳到超过150MB,但一旦调用完成和GC.Collect()被调用内存使用率下降到不到一半的量。远不是一个完美的测试,似乎向我确认,没有内存泄漏,或者是可忽略的(虑到调用10,000 web服务调用可能是不常见的,所有使用单独的客户端实例)。此外,它是一个更简单的模型,比保持一个代理对象周围,不必担心它的错误,不得不重新打开它。 测试方法论:我的测试集中在2个潜在的问题。一个是内存泄漏,另一个是处理器花费在创建和销毁对象上的时间。我的建议是,可以安全地遵循提供课程的公司(Microsoft)提供的示例。如果你担心网络效率,那么你应该没有我的示例的问题,因为正确地创建/部署这些对象不会影响网络延迟。如果花费的时间的99%是网络时间,则对于1%的理论改进的优化在开发时间方面可能是浪费的(假设甚至有益处被获得,我相信我的测试清楚地表明,没有)。是的,网络呼叫是本地的,也就是说,在10,000个服务呼叫的过程中,仅花费大约20秒等待对象。这表示在创建对象时花费的每个服务调用大约2毫秒。关于需要调用Dispose,我并不意味着你不应该叫它,只是它似乎没有必要。如果你忘记了(或者只是选择不),我的测试使我相信Dispose是在这些对象的Finalize中调用。即使如此,调用Dispose自己可能会更有效,但效果仍然可以忽略不计。对于大多数软件开发,通过提出更高效的算法和数据结构,比通过解决这些问题(除非有严重的内存泄漏),您可以获得更多的收益。如果您需要更高的效率,那么也许您不应该使用Web服务,因为有比基于XML的系统更高效的数据传输选项。

大佬总结

以上是大佬教程为你收集整理的.net – Silverlight 4.0和WCF客户端代理 – 如何创建和如何关闭实例全部内容,希望文章能够帮你解决.net – Silverlight 4.0和WCF客户端代理 – 如何创建和如何关闭实例所遇到的程序开发问题。

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

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