Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在wcf服务中实现并发的正确方法是什么?_Multithreading_Wcf_C# 4.0_Service_Concurrency - Fatal编程技术网

Multithreading 在wcf服务中实现并发的正确方法是什么?

Multithreading 在wcf服务中实现并发的正确方法是什么?,multithreading,wcf,c#-4.0,service,concurrency,Multithreading,Wcf,C# 4.0,Service,Concurrency,我正在尝试理解wcf中的并发性,从下载了一个示例代码,并对测试双向调用做了一些更改。令我惊讶的是,尽管我可以看到单向调用的并发性,但我看不到双向调用并发性的效果。 这是WCF并发模型的工作方式吗?或 我做错什么了吗 这是服务代码 [ServiceContract] public interface IHelloWorldService { [OperationContract(IsOneWay=true)] void Call(string ClientName); [

我正在尝试理解wcf中的并发性,从下载了一个示例代码,并对测试双向调用做了一些更改。令我惊讶的是,尽管我可以看到单向调用的并发性,但我看不到双向调用并发性的效果。 这是WCF并发模型的工作方式吗?或 我做错什么了吗

这是服务代码

[ServiceContract]
public interface IHelloWorldService
{
    [OperationContract(IsOneWay=true)]
    void Call(string ClientName);

    [OperationContract]
    string GetData(int value);

    [OperationContract]
    CompositeType GetDataUsingDataContract(CompositeType composite);
}
[DataContract]
public class CompositeType
{
    bool boolValue = true;
    string stringValue = "Hello ";

    [DataMember]
    public bool BoolValue
    {
        get { return boolValue; }
        set { boolValue = value; }
    }

    [DataMember]
    public string StringValue
    {
        get { return stringValue; }
        set { stringValue = value; }
    }
}
[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class HelloWorldService : IHelloWorldService
{
    public static int counter;

    public HelloWorldService()
    {
        counter++;
    }

    public void Call(string ClientName)
    {            
        Console.WriteLine("Instance:" + counter.ToString() + " Thread:" + Thread.CurrentThread.ManagedThreadId.ToString() + " Time:" + DateTime.Now.ToString() + "\n\n");
        Thread.Sleep(5000);
    }

    public string GetData(int value)
    {
        Console.WriteLine("Instance:" + counter.ToString() + " Thread:" + Thread.CurrentThread.ManagedThreadId.ToString() + " Time:" + DateTime.Now.ToString() + "\n\n");
        Thread.Sleep(5000);
        return value.ToString();
    }

    public CompositeType GetDataUsingDataContract(CompositeType composite)
    {
        Console.WriteLine("Instance:" + counter.ToString() + " Thread:" + Thread.CurrentThread.ManagedThreadId.ToString() + " Time:" + DateTime.Now.ToString() + "\n\n");
        Thread.Sleep(5000);
        return composite;
    }
}
这是服务托管代码

class Program
{
    static void Main(string[] args)
    {
        //Create a URI to serve as the base address

        //Uri httpUrl = new Uri("net.tcp://localhost:8001/HelloWorld");
        Uri httpUrl = new Uri("http://localhost:8010/MyService/HelloWorld");

        //Create ServiceHost
        ServiceHost host
        = new ServiceHost(typeof(ClassLibrary1.HelloWorldService), httpUrl);

        //Add a service endpoint
        host.AddServiceEndpoint(typeof(ClassLibrary1.IHelloWorldService)
        , new WSHttpBinding(), "");

        //Enable metadata exchange
        ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
        smb.HttpGetEnabled = true;
        host.Description.Behaviors.Add(smb);

        ServiceThrottlingBehavior stb = new ServiceThrottlingBehavior();
        stb.MaxConcurrentCalls = 100;
        stb.MaxConcurrentInstances = 100;
        stb.MaxConcurrentSessions = 100;
        host.Description.Behaviors.Add(stb);


        //Start the Service
        host.Open();

        Console.WriteLine("Service is host at " + DateTime.Now.ToString());
        Console.WriteLine("Host is running... Press <Enter> key to stop");
        Console.ReadLine();

    }
}
这是服务器跟踪:

    Instance:1 Thread:6 Time:12/17/2012 8:09:29 PM


    Instance:1 Thread:5 Time:12/17/2012 8:09:34 PM


    Instance:1 Thread:7 Time:12/17/2012 8:09:39 PM


    Instance:1 Thread:7 Time:12/17/2012 8:09:44 PM


    Instance:1 Thread:5 Time:12/17/2012 8:09:49 PM


    Instance:1 Thread:7 Time:12/17/2012 8:09:54 PM


    Instance:1 Thread:5 Time:12/17/2012 8:09:59 PM


    Instance:1 Thread:7 Time:12/17/2012 8:10:04 PM

对于这些结果,您可以清楚地看到请求是按顺序处理的。理想情况下,我希望所有8个并发请求都能在5秒内完成。但大约花了42秒才完成。

我仍然认为问题在于设置;代理和来自每个代理的线程数,链接对此进行了很好的解释

也看看下面的链接;可能是测试客户端可能有问题。
我的代码中的问题是代理的使用方式。我只为所有并发客户端创建了一个代理,所有对该服务的调用都是通过该代理进行的。因此,所有这些呼叫都在通道中排队。按照模拟wcf负载测试的方式,为每个客户机创建一个代理,解决了问题。

仅链接答案没有帮助。如果你提供了一个链接,它应该支持你的答案。如果/当链接失效时,仅链接的答案也会完全失去意义。
    Enter number of concurrent clients:
    8
    Kind of method (1: One way, 2: Two way 3: Two way using data contract):
    2
    OverAll Elapsed Time: 42022
    Individual Elapsed Time: 42021
    Individual Elapsed Time: 37013
    Individual Elapsed Time: 32008
    Individual Elapsed Time: 26987
    Individual Elapsed Time: 21981
    Individual Elapsed Time: 16980
    Individual Elapsed Time: 11968
    Individual Elapsed Time: 6985
    Instance:1 Thread:6 Time:12/17/2012 8:09:29 PM


    Instance:1 Thread:5 Time:12/17/2012 8:09:34 PM


    Instance:1 Thread:7 Time:12/17/2012 8:09:39 PM


    Instance:1 Thread:7 Time:12/17/2012 8:09:44 PM


    Instance:1 Thread:5 Time:12/17/2012 8:09:49 PM


    Instance:1 Thread:7 Time:12/17/2012 8:09:54 PM


    Instance:1 Thread:5 Time:12/17/2012 8:09:59 PM


    Instance:1 Thread:7 Time:12/17/2012 8:10:04 PM