可靠的n层WCF(线程问题?)

可靠的n层WCF(线程问题?),wcf,multithreading,n-tier-architecture,Wcf,Multithreading,N Tier Architecture,我正在使用层间WCF开发一个n层应用程序,以便: 第1层:Silverlight应用程序 调用搜索请求 IClientBroker clientBroker = UIContext.CreateWcfInterface<IClientBroker>("Data/ClientBroker.svc"); clientBroker.BeginSearchForClients(SearchTerm, 20, (result) => {

我正在使用层间WCF开发一个n层应用程序,以便:

第1层:Silverlight应用程序 调用搜索请求

        IClientBroker clientBroker = UIContext.CreateWcfInterface<IClientBroker>("Data/ClientBroker.svc");
        clientBroker.BeginSearchForClients(SearchTerm, 20, (result) =>
        {
            SearchResult[] results = ((IClientBroker)result.AsyncState).EndSearchForClients(result).ToArray();

            // do stuff, update UI, etc.

        }, clientBroker);
第3层:是“服务器”,因为它提供了net.tcp端点(允许安全客户端在不使用Silverlight的情况下进行连接)。这是请求的最终目标

    public class ClientBroker : IClientBroker // note this is different to tier 2 interface
    {

        public SearchResult[] SearchForClients(string keywords, int? maxResults)
        {
                    // do stuff
            if (maxResults.HasValue)
            {
                return results.Take(maxResults.Value).ToArray();
            }
            else
            {
                return results.ToArray();
            }
        }
     }
所以我的电话是:

Silverlight->httpBasic->IIS托管的代理WCF服务-->net.tcp-->EXE托管的WCF服务

这很有效。我可以通过层传递标题,维护会话等,这是非常整洁的

但是,只需通过此操作进行几次呼叫,就会导致通信超时

服务器EXE执行其工作所需的时间是可忽略的。 我看到的问题是服务器在将结果返回到第2层时“冻结”

我认为这与线程被锁定有关

我环顾四周,发现实现这一点的理想方法是使我的Tier 2异步运行,类似于下面的代码:

    public SearchResult[] SearchForClients(string keywords, int? maxResults)
    {
        ClientBrokerClient clientBroker = CreateClientBrokerClient();
        clientBroker.BeginSearchForClients(keywords, maxResults, result =>
            {
                SearchResult[] searchResults=((ClientBrokerClient)result.AsyncState).EndSearchForClients(result);
                // how to return results from here?
            }, clientBroker);

    }
但是,当我的第1层客户机正在等待该方法的结果时,如何实现这一点呢?该方法将在回调执行之前直接退出?我在构建运营合同方法时是否遗漏了什么

更新:

从那以后,我通过向服务器(第3层)发出许多请求,从一个避免第2层的客户机开始对服务器(第3层)进行测试。第3层的net.tcp WCF频道似乎坚如磐石

更新2:

这篇博客文章使用IAsyncResult模式进行了概述,我在这里没有提到。我找错树了吗

更新3:

好的,这段来自那个博客:

“如果您正在构建N层WCF 服务,您将拥有WCF服务 调用WCF客户端代理的操作 用于其他后端服务。在此 如果是这样,你需要确保 中间层(路由层)具有 异步服务操作 调用异步WCF代理 操作。这样,您的 中间层不会耗尽线程 在处理许多缓慢的操作时。”


似乎证实了我怀疑问题在于中间层(第2层)。如何实现这种开始/结束异步?我是否必须手动执行此操作,或者是否可以保留VS工具来为我生成代理类?(我真的不想手动操作,合同中有一定程度的变化)

好吧,我想我已经解决了。这个话题帮助了我:

基本上,我没有关闭第二层中的客户端代理,我意识到这会导致阻塞。代码的演变是这样的,我最终使用(){}块删除了它,以促进异常不会因客户端代理而消失。然而,我已经重新构造并重新测试了我的Tier 2代码,现在看起来像:

    public SearchResult[] SearchForClients(string keywords, int? maxResults)
    {
        ClientBrokerClient clientBroker = CreateClientBrokerClient();

        SearchResult[] searchResults=clientBroker.SearchForClients(keywords, maxResults);
        clientBroker.Close();
        return searchResults;
    }

。。。例外情况不会消失。

好吧,我想我已经解决了。这个话题帮助了我:

基本上,我没有关闭第二层中的客户端代理,我意识到这会导致阻塞。代码的演变是这样的,我最终使用(){}块删除了它,以促进异常不会因客户端代理而消失。然而,我已经重新构造并重新测试了我的Tier 2代码,现在看起来像:

    public SearchResult[] SearchForClients(string keywords, int? maxResults)
    {
        ClientBrokerClient clientBroker = CreateClientBrokerClient();

        SearchResult[] searchResults=clientBroker.SearchForClients(keywords, maxResults);
        clientBroker.Close();
        return searchResults;
    }
。。。例外情况也不会消失