Программно набор тайм-аут WCF в режиме отладки

Некоторые удобные, которые я использую часто:

Ctrl + J -> Силы Intellisence для появления.

Ctrl + Высокий звук + L -> Шоу Проводник Решения.

10
задан Cœur 21 January 2019 в 11:45
поделиться

2 ответа

Вы можете сделать следующее:

  • создать привязку и конечную точку в коде
  • установить таймауты для экземпляра привязки
  • , затем создать свой клиентский прокси, используя эти два элемента

Что-то вроде:

BasicHttpBinding myBinding = new BasicHttpBinding("ConfigName");
myBinding.CloseTimeout = .......
myBinding.OpenTimeout = .......
myBinding.ReceiveTimeout = .......
myBinding.SendTimeout = .......

EndpointAddress myEndpoint = new EndpointAddress("http://server:8181/yourservice");

YourServiceClient proxy = new YourServiceClient(myBinding, myEndpoint);

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

13
ответ дан 3 December 2019 в 22:37
поделиться

При отсутствии более простого решения можно попытаться запустить часть кода в другом процессе с помощью CreateRemoteThread (), поясняет здесь .

-121--2733367-

Если необходимо дождаться выполнения всех задач, необходимо выполнить их самостоятельно. Потоки ThreadPool являются фоновыми потоками и не поддерживают работу приложения.

Это относительно чистый способ справиться с таким типом ситуации:

 using (var mre = new ManualResetEvent(false))
 {
      int remainingToProcess = workItems.Count(); // Assuming workItems is a collection of "tasks"
      foreach(var item in workItems)
      {
           // Delegate closure (in C# 4 and earlier) below will 
           // capture a reference to 'item', resulting in
           // the incorrect item sent to ProcessTask each iteration.  Use a local copy
           // of the 'item' variable instead.
           // C# 5/VS2012 will not require the local here.
           var localItem = item;
           ThreadPool.QueueUserWorkItem(delegate
           {
               // Replace this with your "work"
               ProcessTask(localItem);

               // This will (safely) decrement the remaining count, and allow the main thread to continue when we're done
               if (Interlocked.Decrement(ref remainingToProcess) == 0)
                      mre.Set();
           });
      }
      mre.WaitOne();
 }

При этом обычно лучше «сгруппировать» рабочие предметы, если у вас их тысячи, а не рассматривать их как отдельные рабочие предметы для threadpool. Это некоторые накладные расходы, связанные с управлением списком предметов, и поскольку вы не сможете обрабатывать 22000 одновременно, лучше сгруппировать их в блоки. Наличие отдельных предметов каждый процесс 50 или около того, вероятно, поможет вашей общей пропускной способности довольно немного...

-121--3464966-

Можно создать вторую привязку в web.config и установить более длинный sendTimeout.

        if (debug)
        {
            proxy =  new MyClient("WSHttpBinding_MyLocal");
        }
        else
        {
            proxy = new MyClient("WSHttpBinding_MyDev");
        }

        <wsHttpBinding>
            <binding name="WSHttpBinding_MyLocal" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:20:00"

...

2
ответ дан 3 December 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: