Wcf + asp.net + несколько потоков - PullRequest
0 голосов
/ 25 марта 2011

У меня есть следующий сценарий:

Служба, которая ничего не делает, но спит в течение времени, которое WPF указывает через объект WebRequest:

   public class WorkerSvc : IWorkerSvc
   {

    #region IWorkerSvc Members

    public void DoWork(int timeToSleep)
    {
        Trace.WriteLine(DateTime.Now.ToString() + "\tInside Stress Service with TimeToSleep: " + timeToSleep.ToString());

        if (timeToSleep == 0)
            return;

        Thread.Sleep(timeToSleep * 1000);

        Trace.WriteLine(DateTime.Now.ToString() + "\tThe Thread woke up.");

    }

Затем страница aspx (отдельнаяпроект), который вызывает в службу:

       protected void Page_Load(object sender, EventArgs e)
    {
        System.Diagnostics.Trace.WriteLine(DateTime.Now.ToString() + "  \tInside default stress web site page load;");

        using (WorkerService.WorkerSvcClient client = new StressWebSite.WorkerService.WorkerSvcClient()) 
        {
            System.Diagnostics.Trace.WriteLine(DateTime.Now.ToString() +  "  \tCreated a new client of Stress WCF Service;");

            var rowdata = Request.QueryString["SleepValue"];
            System.Diagnostics.Trace.WriteLine(DateTime.Now.ToString() + " \tDetected Sleep Value in the Request: " + rowdata);

            int realData = 0;

            if (!string.IsNullOrEmpty(rowdata))
            {
                if (int.TryParse(rowdata, out realData))
                {
                    System.Diagnostics.Trace.WriteLine(DateTime.Now.ToString() + " \tBefore Dowork() with SleepValue: " + realData);
                    client.DoWork(realData);
                    System.Diagnostics.Trace.WriteLine(DateTime.Now.ToString() + " \tAfter DoWork() with SleepValue: " +  realData);
                    Response.Write(realData.ToString());
                    //Response.End();
                }

            }

        }
    }         

Форма WPF, которая охватывает несколько потоков, которые по существу отправляют некоторые данные на страницу aspx:

   private void PerformStress()
    {
        WebRequest request = WebRequest.Create(string.Concat(this.txtStressPageUrl.Text, "?", "SleepValue", "=", this.txtSleepValue.Text));
        Trace.WriteLine("Created Web Request");
        request.Credentials = CredentialCache.DefaultCredentials;

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Stream dataStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(dataStream);

        string responseFromServer = reader.ReadToEnd();
        //return responseFromServer;
    }



    private void button3_Click(object sender, RoutedEventArgs e)
    {
        int stressThreadsCount = 0;

        if (!int.TryParse(this.txtStressThreadCount.Text, out stressThreadsCount))
            MessageBox.Show("Enter number of threads to stress");


        ThreadStart start = delegate()
        {
            DispatcherOperation op = Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(PerformStress));

            DispatcherOperationStatus status = op.Status;

            while (status != DispatcherOperationStatus.Completed)
            {
                status = op.Wait(TimeSpan.FromMilliseconds(1000));
                if (status == DispatcherOperationStatus.Aborted)
                {
                    //
                }
            }


        };

        for (int i = 0; i < stressThreadsCount; i++)
        {
            var t = new Thread(start);
            //this.runningThreads.Add(t);
            t.Start();
            //t.Join();
        }

    }

Проблема в том, что онаПохоже, хотя я породил несколько потоков со стороны WPF, чтобы опубликовать на странице aspx, все потоки обрабатываются в последовательном порядке, то есть каждый поток ожидает возврата службы.

Я запускаю этот набор в cassiny.

I не указывает, что поведение службы WCF является одноэлементным.Пожалуйста, помогите определить проблему - я хотел бы смоделировать несколько запросов к IIS и странице, которая вызывает WCF, чтобы доказать концепцию.

1 Ответ

1 голос
/ 25 марта 2011

Singleton влияет только на то, сколько объектов будет создано для запросов на обслуживание.Однако по умолчанию службы WCF одновременно обрабатывают только один запрос.Чтобы изменить это, вы должны украсить реализацию своей службы с помощью

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]

Для получения дополнительной информации см. Здесь: http://msdn.microsoft.com/en-us/library/system.servicemodel.concurrencymode.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...