В сервисах с сохранением состояния сервисной структуры есть RunAsync (cancellationToken) с использованием () для транзакции диспетчера состояний.
Устаревший код, который я хочу реорганизовать, содержит две очереди с попытками удаления из очереди внутри while (true) с1 секунда задержкиЯ хотел бы избавиться от этой ненужной задержки и вместо этого использовать две отдельные реактивные очереди (семафоры с надежными очередями).
Проблема в том, что теперь два отдельных рабочих процесса, зависящих от этих двух очередей, необходимо разделить на двеотдельные потоки, потому что если эти две очереди выполняются в одном потоке, одна wait () заблокирует выполнение другого кода.(Я знаю, что, вероятно, лучшая практика разделит эти две задачи на два микросервиса, следующий проект.)
В качестве решения я придумал следующий код:
protected override async Task RunAsync(CancellationToken cancellationToken)
{
await Task.WhenAll(AsyncTask1(cancellationToken), AsyncTask2(cancellationToken)).ConfigureAwait(false);
}
И каждая задача содержит что-то вроде:
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
using (var tx = this.StateManager.CreateTransaction())
{
var maybeMessage = await messageQueue.TryDequeueAsync(tx, cancellationToken).ConfigureAwait(false);
if (maybeMessage.HasValue)
{
DoWork();
}
await tx.CommitAsync().ConfigureAwait(false);
}
}
Кажется, работает, но я просто хочу убедиться, что использование (statemanger.createTansaction ()) нормально для использования таким параллельным способом ..