Nabeel Akhtar Ответов: 1

Режим Wcf concurreny не работает


У меня есть служба WCF, которая возвращает время начала и окончания метода в списке строк. Я установил режим параллелизма на multiple и InstanceContextMode=PerCall. Когда я вызываю метод службы с помощью await из клиентского приложения, оба запроса не выполняются параллельно. Пожалуйста, ознакомьтесь с кодом сервиса и клиента ниже:

сервисный код
[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple,InstanceContextMode =InstanceContextMode.PerCall)]
    public class Service1 : IService1
    {
        public List<string> GetData(int value)
        {
            List<string> lst = new List<string>();
            DateTime dt1 = DateTime.Now;
            lst.Add("Request :"+value+"---Start Time ----"+dt1.Hour + "_" + dt1.Minute + "_" + dt1.Second + "_" + dt1.Millisecond);
            Thread.Sleep(2000);
             dt1 = DateTime.Now;
            lst.Add("Request :" + value + "---End Time ----"+dt1.Hour + "_" + dt1.Minute + "_" + dt1.Second + "_" + dt1.Millisecond);
            return lst;
        }

        
    }


Клиент

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestWCFConClient
{
    public class MyClient
    {
        public async void Do()
        {
            List<Task> lsttask = new List<Task>();
            DateTime dtf = DateTime.Now;
            Console.WriteLine("Execution Begin " + dtf.Hour + "_" + dtf.Minute + dtf.Second + "_" + dtf.Millisecond);
            // ThreadPool.SetMaxThreads(8,8);
            //ThreadPool.SetMinThreads(8, 8);
            //int c;
            //int io;
            //ThreadPool.GetMaxThreads(out c, out io);
            List<string[]> lststr = new List<string[]>();
            ServiceReference1.Service1Client objClient = new ServiceReference1.Service1Client();

            for (int i = 0; i < 2; i++)
            {
                try
                {
                    DateTime dtCurrent = DateTime.Now;
                    int current = i + 1;
                   
                    var objTask = await Task<string[]>.Run(() =>
                    {

                      
                        Task<string[]> obj = objClient.GetDataAsync(current);
                      for(int a=0;a<obj.Result.Length;a++ )

                        {
                            Console.WriteLine(current + obj.Result[a]);
                        }
                        return obj;
                    });
                    lststr.Add(objTask);
                    //  Thread.Sleep(100);
                }
                catch (Exception ex)
                {

                }

            }
            DateTime dte = DateTime.Now;
            Console.WriteLine("Execution End " + dte.Hour + "_" + dte.Minute + "_" + dte.Second + "_" + dte.Millisecond);

          
        
        }
    }
}


Выход
Execution Begin 22_5321_403
1Request :1---Start Time ----22_53_22_703
1Request :1---End Time ----22_53_24_704
2Request :2---Start Time ----22_53_24_798
2Request :2---End Time ----22_53_26_799
Execution End 22_53_26_810


Мне нужны запросы 1 и 2 оба должны начинаться одновременно

Что я уже пробовал:

Я попробовал вышеприведенное решение, но оно не дает ожидаемого результата

1 Ответов

Рейтинг:
2

Gerry Schmitz

Await говорит: "Не продолжайте, пока я не закончу". Как вы предполагаете "петлю" в этих условиях?

Напишите простую параллельную программу, используя параллель.По Каждому Элементу | Майкрософт Документы[^]