0

2 つの数値を追加し、構成可能なミリ秒数を待機するメソッドを使用して、テスト用の WCF サーバーを作成しています。

私は wcf クライアントを書きました。このクライアントの 2 つのインスタンスを開くと、clientA の待機値は 50 秒で、もう一方の clientB の待機時間は 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>
4

2 に答える 2

1

2 つの呼び出しが同じセッションを共有しているため、InstanceContextMode = InstanceContextMode.PerSession 設定に問題がある可能性があります。InstanceContextMode = InstanceContextMode.PerCall を試してください。

どちらの呼び出しもサービスの 1 つのインスタンスを使用していますが、最初の呼び出しが 50 秒間停止した場合、2 番目の呼び出し処理は、スレッドがビジネスに戻って最初の呼び出しを処理するまで待機します。

于 2013-02-09T16:49:24.887 に答える
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());

    }
}
于 2013-02-09T17:04:19.510 に答える