2013-02-09 120 views
0

我正在编写一个测试WCF服务器,并添加2个数字并等待可配置的毫秒数。多线程服务器

我写了一个wcf客户端。当我打开此客户端的两个实例时 - 在clientA上,等待值为50秒,而在另一个客户端B上,等待时间为0秒。我期望当客户端A正在运行(长进程)时,客户端B将立即得到它的响应。

但它不工作。我一直在关注本教程WCF Concurrency

为什么它不适合我?

WCF服务

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Text; 


namespace WCFService 
{ 
    //[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,ConcurrencyMode = ConcurrencyMode.Multiple,UseSynchronizationContext = true)] 
    //[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,ConcurrencyMode = ConcurrencyMode.Single)] 
    //[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] 
    //[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession,ConcurrencyMode = ConcurrencyMode.Multiple)] 
    //[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)] 
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession,ConcurrencyMode = ConcurrencyMode.Multiple)] 
    public class WCFJobsLibrary : IWCFJobsLibrary 
    { 

     public ReturnClass AddNumbers(int FirstNumber, int SecondNumber, int Delay) //Add two numbers and wait a predefined interval 
     { 
      ReturnClass myReturnClass = new ReturnClass(-1, null, null, 0); 
      try 
      {    

       myReturnClass.ErrorCode = 1; 
       myReturnClass.Result = FirstNumber + SecondNumber; 
       System.Threading.Thread.Sleep(Delay); // Wait 
       return myReturnClass; 

      } 
      catch (Exception ex) 
      {    
       myReturnClass.ErrorCode = -1; 
       myReturnClass.ErrorMessage = ex.ToString(); 
       return myReturnClass; 
      } 

     } 

    } 
} 

WCF客户

try 
      { 

       radTextBoxResult.Text = ""; // Reset Result 
       ServiceReference1.WCFJobsLibraryClient Client = new ServiceReference1.WCFJobsLibraryClient(); 
       Client.Endpoint.Address = new System.ServiceModel.EndpointAddress(radTextBoxbaseAddress.Text); 
       WCFClient.ServiceReference1.ReturnClass AddNumbers_Result; 
       AddNumbers_Result = Client.AddNumbers(int.Parse(radTextBoxFirstNumber.Text), int.Parse(radTextBoxSecondNumber.Text), int.Parse(radTextBoxDelay.Text)); 


       if (AddNumbers_Result.ErrorCode < 0) 
       { 
        // If exception happens, it will be returned here 
        MessageBox.Show(AddNumbers_Result.ErrorCode.ToString() + " " + AddNumbers_Result.ErrorMessage + " " + AddNumbers_Result.ExMessage); 
       } 

       else 
       { 

        radTextBoxResult.Text = AddNumbers_Result.Result.ToString(); 

       } 

      } 

      catch (Exception ex) 
      { 

       MessageBox.Show(ex.Message.ToString()); 

      } 

App.Config中

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
     <behaviors> 
      <serviceBehaviors> 
       <behavior name=""> 
        <serviceMetadata httpGetEnabled="true" /> 
        <serviceDebug includeExceptionDetailInFaults="false" /> 
        <serviceThrottling maxConcurrentCalls="16" maxConcurrentInstances="2147483647" maxConcurrentSessions="10" /> 
       </behavior> 
      </serviceBehaviors> 
     </behaviors> 
     <services> 
      <service name="WCFService.WCFJobsLibrary"> 
       <endpoint address="" binding="wsHttpBinding" contract="WCFService.IWCFJobsLibrary"> 
        <identity> 
         <dns value="localhost" /> 
        </identity> 
       </endpoint> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
       <host> 
        <baseAddresses> 
         <add baseAddress="http://localhost:8732/Design_Time_Addresses/WCFService/WCFJobsLibrary/" /> 
        </baseAddresses> 
       </host> 
      </service> 
     </services> 
    </system.serviceModel> 
</configuration> 
+1

“然而,不工作。”发生了什么以及预期的是什么? – usr 2013-02-09 16:26:43

+0

我期望的是,如果clientA的Delay值是50秒,并且我按下按钮来添加两个数字。然后,当我运行时,我以1秒的延迟值启动ClientB,然后按下按钮添加两个数字,它在一秒钟后得到结果。究竟发生了什么,直到ClientA得到结果才得到结果。 – user1438082 2013-02-09 16:39:25

+1

开始拨打50个延迟版本的100个电话。打破服务器上的调试器。大多数线程停止在哪里?发布堆栈。 – usr 2013-02-09 16:49:54

回答

0

问题是我在主线程的winform应用程序中启动服务。您需要在单独的线程上启动WCF,如下所示。

C#代码

private void radButtonStartWCFService_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     Thread Trd = new Thread(() => StartWCFServer()); 
     Trd.IsBackground = true; 
     Trd.Start(); 

     radButtonStartWCFService.Enabled = false; 
     radButtonStartWCFService.Text = "WCF Server Started"; 

    } 

    catch(Exception ex) 
    { 
     MessageBox.Show(ex.Message.ToString()); 
    } 
} 


private void StartWCFServer() 
{ 

    try 
    { 
     sHost = new ServiceHost(typeof(WCFService.WCFJobsLibrary)); 
     sHost.Open(); 

    } 

    catch (Exception ex) 
    { 

     MessageBox.Show(ex.Message.ToString()); 

    } 
} 
1

问题可能是InstanceContextMode = InstanceContextMode.PerSession设置,因为您的2个电话共享相同的会话。尝试InstanceContextMode = InstanceContextMode.PerCall。

这两个调用都使用您的服务的一个实例,但如果第一个调用将它停止50秒,那么第二个调用处理将等待,直到线程重新开始工作并服务第一个调用。

+0

TX,但我觉得它 - 病态现在把答案放在现在 – user1438082 2013-02-09 17:02:41