Эффективное чтение двух разных System.Threading.Channel из одного потокаC#

Место общения программистов C#
Anonymous
Эффективное чтение двух разных System.Threading.Channel из одного потока

Сообщение Anonymous »

Предположим, что следующая ситуация:
  • У меня есть два разных потока событий.
  • Поток 1 – это поток событий по запросу. поток очень быстро меняющихся событий (подумайте о ценах на финансовые инструменты)
  • Поток 2 движется гораздо медленнее (подумайте о действиях, которые следует предпринять в зависимости от этих цен)
    < li>Оба потока должны обрабатываться в одном совместном рабочем потоке/задаче.
  • Реализация должна быть максимально эффективной.
  • Поток 2 должен обрабатываться с помощью приоритет/перед потоком 1
Один из способов сделать это — поместить все в System.Threading.Channel< /code> — это соответствует всем вышеперечисленным требованиям, кроме последнего. Насколько мне известно, нет способа установить приоритет события 2 над элементом 1.
Возможно, лучшим способом было бы поместить эти события в отдельные каналы и читать их из обоих. каналов.
Но как лучше всего это сделать?
Грубо говоря, я мог бы сделать это:

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

class Example {
private readonly Channel _channel1 = Channel.CreateBounded(....);
private readonly Channel _channel2 = Channel.CreateBounded(....);

public async Task Worker(CancellationToken ct) {
while(!ct.IsCancellationRequested) {
var valueTask1 = _channel1.Reader.WaitToReadAsync(ct);
var valueTask2 = _channel2.Reader.WaitToReadAsync(ct);

// Waaait a moment.. this is wishful thinking! WhenAny for ValueTasks does not exist, at least not out-of-the-box
if(await ValueTaskExtensions.WhenAny(valueTask1, valueTask2) == 0)
{
// valueTask1 triggered
var element = await _channel1.Reader.ReadAsync(ct);
// Process
} else {
// valueTask2 triggered
var element = await _channel2.Reader.ReadAsync(ct);
// Process
}
}
}

}
С оговоркой, что встроенного ValueTask.WhenAny() нет. Превращение этих задач в правильные задачи может показаться очень расточительным из-за ассигнований для каждого входящего ценового тика.
Однако существует вклад сообщества в реализацию WhenAny, хотя я не использовал те, которые на практике пока не могу судить об их качестве и возможных предостережениях.
Есть ли более умный способ читать по двум каналам из одной ветки чтения, не покидая чудесный мир ValueTasks ?

Подробнее здесь: https://stackoverflow.com/questions/785 ... ame-thread

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