Поток прерывается исключение при использовании SemaphoreSlim - PullRequest
0 голосов
/ 19 декабря 2018

У меня возникла проблема с темой. Прерывалось прерывание исключения, которое было решено в этом сообщении. Ошибка прерывания потока при выполнении вызова службы из асинхронного метода

List<Task> tasks = new List<Task>();
using (var throttler = new SemaphoreSlim(10))
{
  foreach (var cust in e.customers)
  {
    await throttler.WaitAsync();
    tasks.Add(Task.Run(() =>
    {
      try
      {
        exMan.perfomAction(cust, userId);
      }
      finally
      {
        throttler.Release();
      }
    }));
  }
}
   Task.WaitAll(tasks.ToArray());

Если ясделайте exMan.perfomAction асинхронным и передайте throttler в метод следующим образом, он работает.Я не знаю, почему это работает, если это мешает асинхронному процессу, и если у этого подхода есть какие-то недостатки?

List<Task> tasks = new List<Task>();
using (var throttler = new SemaphoreSlim(10))
{
  foreach (var cust in e.customers)
  {
    tasks.Add(exMan.perfomAction(cust, userId, throttler));
  }
}
Task.WaitAll(tasks.ToArray());

public async Task performAction(Customer customer, string userId, SemaphoreSlim throttler)
{
  await throttler.WaitAsync();

  //--Do stuff (service calls, DB calls, export to file

  throttler.Release();
}

РЕДАКТИРОВАТЬ

Итак, явнес два изменения, которые, кажется, изменили ситуацию и работают, как и ожидалосьВызов службы выполнен асинхронно и ожидается.

var axPriceList = await client.findExAsync(callContext, queryCriteria, documentContext);

Теперь ожидается корневой вызов, который вызывает метод, содержащий приведенный ниже код

private async Task CallingMethod(string cust, string userId)
{
  await MehodA(string cust, string userId);
}

private async Task MehodA(string cust, string userId)
{
    List<Task> tasks = new List<Task>();
    using (var throttler = new SemaphoreSlim(10))
    {
      foreach (var cust in e.customers)
      {
        tasks.Add(tasks.Add(Task.Run(async () =>
        {
          try
          {
            await exMan.perfomAction(cust, userId);
          }
          finally
          {
            throttler.Release();
          }
        }));
      }
    }
    await Task.WhenAll(tasks);
}
...