首页  »   C#

WCF服务端的执行有关问题

网友分享于:2014-07-15  浏览:0次
WCF服务端的执行问题
我用WCF做了一个测试程序,使用的是TCP/IP协议,用两个客户端同时访问服务端,也可以说是同时调用同一个方法,
在这个方法中有一个分支,客户端A和B应该走的是不同的分支,但结果却和我想的不一样,下面是服务端的代码:

 if (String1  == "1")
            {
                BusinessServer.MainForm.WriteLog(String1 + " In " + DateTime.Now.ToString("HHmmss") + "\r\n");

                if (MyGlobal.iTest == 6000)
                {
                    sReturn = "Yes";

                    System.Threading.Thread.Sleep(5000);

                    MyGlobal.iTest = 7000;
                }
                else
                {
                    sReturn = "No";
                }

                BusinessServer.MainForm.WriteLog(String1 + " Out" + DateTime.Now.ToString("HHmmss") + "\r\n");
            }
            else
            {
                BusinessServer.MainForm.WriteLog(String1 + " In " + DateTime.Now.ToString("HHmmss") + "\r\n");

                if (MyGlobal.iTest == 6000)
                {

                    sReturn = "Yes";

                    MyGlobal.iTest = 7000;
                }
                else
                {
                    sReturn = "No";
                }

                BusinessServer.MainForm.WriteLog(String1 + " Out" + DateTime.Now.ToString("HHmmss") + "\r\n");
            }


iTest是一个静态的变量。

在我的想象中,两个客户端接到的返回值都是Yes,因为A在调用时延迟了5秒,还没有改变iTest,这样B在调用时也应该返回Yes。
结果是A返回的是Yes,B返回的是No

服务端跟踪的结果是:
1 In 162000

1 Out162005

2 In 162005

2 Out162005

看结果好像是A执行完了,B的调用才会执行。但理想中的结果是A在运行的过程,B就已经开始调用了,而且B应该先
执行完毕,应为B不用等待5秒。


有明白其中原理的高手讲解一下,其中的缘由。
------解决方案--------------------
如果没有给A和B各开一个线程处理,那么执行完A才执行B是期望的结果.
------解决方案--------------------
即使你用的是异步调用,但是其实用的是同一个线程.
如果你处理完A的数据立即返回,那么A和B看起来就是都在通信,似乎互相没有影响.
但是如果执行SLEEP阻塞了线程,就会有影响

相关解决方案

最新解决方案