У меня 1-ядерная машина, и я бы хотел улучшить свою производительность кода с помощью async и ждать. Код имеет две основные части. первая операция ввода-вывода. (чтение из очереди служебной шины azure для нескольких sessionId), во-вторых, обработка данных - процессор тяжелый. я обернут метод DequeueAsync в методе асинхронного который возвращает задачу: тяжелый методЛучшая производительность с использованием async и ожидания
private async Task<SomeReturnValue> AcceptFromQueueAsync(){
try{
SomeReturnValue result = await DequeueAsync.configureAwait(false);
return SomeReturnValue;
}
catch{
//logging and stuff
}
Процессора синхронизация: DoSyncWork() Так как вторая часть процессора тяжелый я не хочу, чтобы использовать параллелизм (на самом деле не может ...) Часть ЦП может начинаться только тогда, когда заканчивается часть ввода-вывода. Учитывая приведенное выше, следующая реализация - путь к 1 компьютеру с процессором?
private void AcceptAndProcessWrapper(){
//Count is some cosnt defined outside the method
_acceptTasks = new List<Task<SomeReturnValue>>();
for (var i = 0; i < Count; i++)
{
_acceptTasks.Add(AcceptFromQueueAsync());
}
//The use of list is for convince in processing
Task.WaitAll(_acceptTasks.ToArray());
//The CPU part
Task.Run(DoSyncWork).Wait();
}
Я знаю, что я мог бы не использовать Task.Run() для синхронизации части, но я хочу, чтобы позволить реализацию функции на нескольких ядрах (Запустив несколько задач с помощью Task.Run() и удерживать их в массив) Будет ли реализация выше. (Многократные вызовы метода async, который возвращает задачу) улучшают производительность? Или мне нужно запустить новую задачу для каждого асинхронного вызова, например Task.Run (AcceptFromQueueAsync)?
Звуки для меня, как вы можете посмотреть в TPL DataFlow. –