У меня возникла проблема с темой. Прерывалось прерывание исключения, которое было решено в этом сообщении. Ошибка прерывания потока при выполнении вызова службы из асинхронного метода
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);
}