Async Execution: исследование прерывистой задержки между двумя операторами журналаC#

Место общения программистов C#
Ответить
Anonymous
 Async Execution: исследование прерывистой задержки между двумя операторами журнала

Сообщение Anonymous »

приложение: < /strong>
У нас есть многопоточная библиотека, подготовленная с NetStandard2.0, используя язык программирования C#. < /p>
Дополнительная информация (обновление ):
эта библиотека потребляется несколькими процессами в одно и то же время. Например; У нас может быть 40 инструментов, и каждый инструмент будет выполнен в той же физической или виртуальной машине и использовал эту библиотеку. /p>
Описание проблемы: < /strong>
Я испытываю прерывистую проблему блокировки при выполнении следующего блока кода в моей библиотеке. В нормальных условиях выполнение заканчивается в одних и тех же миллисекундах, но иногда существует задержка (наконец -то 45 с) между двумя операторами логарифма. Я хочу понять, что может привести к этой задержке.

Код: Выделить всё

public class ToolCheckLayer
{
private async Task CheckAsync(CancellationToken cancellationToken)
{
Logger?.Info("KeepAlive is working...");
using (var messageListener = await _bus.CreateListenerAsync(cancellationToken)
.ConfigureAwait(false))
{
// Some operations
return true;
}
return false;
}
}

фрагмент кода: [/b]
Вот соответствующий код, связанный с созданием прослушивателя шины:

Код: Выделить всё

public class MessageBus
{
private readonly ILogger _logger;
private readonly SemaphoreSlim _listenerSemaphore;

public class MessageBusListener : IDisposable
{
private readonly ILogger _logger;
private readonly bool _privileged;
private readonly BufferBlock _queue;

public MessageBusListener(ILogger logger, bool privileged,
Action disposeAction)
{
_logger = logger;
_priviledged = privileged;
_queue = new BufferBlock();
}

// Some Functions...
}

public MessageBus(ILogger logger, int maxConcurrentListeners)
{
_logger = logger;
_listenerSemaphore = new SemaphoreSlim(maxConcurrentListeners);
}

public async Task CreateListenerAsync(
CancellationToken cancellationToken)
{
_logger?.Debug("Creating listener...");
await _listenerSemaphore.WaitAsync(cancellationToken);

var listener = new MessageBusListener(_logger, privileged: false, () =>
{
_listenerSemaphore.Release();
});

// Operations

return listener;
}
}

Расследования на данный момент:
Проблема не возникает постоянно; это происходит случайным образом через несколько недель или месяцев бесперебойной работы.
В период блокировки не наблюдалось никаких узких мест в процессоре, памяти или вводе-выводе.
Последние результаты ( Обновление-2)
Tool 1
10:20:16.4951|INFO|ToolCheckLayer [1]: KeepAlive is working...
--- Here: ~45 seconds blocking sometimes less... ----------->
10:21:00.0168|DEBUG|MessageBus [1]: Creating listener...

Tool 2
10:20:15.2180|INFO|ToolCheckLayer [1]: KeepAlive is working...
--- Here: ~45 seconds blocking sometimes less... ----------->
10:21:00.0171|DEBUG|MessageBus [1]: Creating listener...

Tool 3
2025-01-23 10:20:16.4638|INFO|ToolCheckLayer [1]: KeepAlive is working...
--- Here: ~45 seconds blocking sometimes less... ----------->
2025-01-23 10:21:00.0144|DEBUG|MessageBus [1]: Creating listener...
...
< /code>
Мы снова столкнулись с проблемой на 24 инструментах, но на этот раз продолжительность блокировки довольно длинная. В соответствии с временными метками журнала, CreateListenerEnerasync () для каждого инструмента блокируется до определенного времени. (10: 21: 00.01xx) тогда все блоки бесплатны. Данные не было получено для повышения подозрений.
Использование ЦП %3, память %40 и т. Д. < /p>
Большое спасибо всем, кто внес свой вклад.>

Подробнее здесь: https://stackoverflow.com/questions/793 ... statements
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»