** Я суммировал этот вопрос внизу с правкой **
Это было задано ранее, но я думаю, что мои обстоятельства другие.
Я обрабатываю несколько запросов одновременно .
Это мой код для этого, он запускается в al oop. Я удалил немного кода, который обрабатывает переменную taskAllocated для краткости.
while (!taskAllocated)
{
lock (_lock)
{
// Find an empty slot in the task queue to insert this task
for (i = 0; i < MaxNumTasks; i++)
{
if (_taskQueue[i] == null)
{
_taskQueue[i] = Task.Run(() => Process());
_taskQueue[i].ContinueWith(ProcessCompleted);
break;
}
}
}
}
Процесс - это типичный async Task Process() { CpuIntensiveStuff(); }
метод.
Я выполняю приведенный выше код, и это работало нормально. Это многопоточность приятно. Всякий раз, когда элемент входит, он найдет пустой слот в очереди задач и удалит его. Когда задача завершается, запускается метод ProcessCompleted и освобождается слот.
Но потом я подумал: а не следует ли использовать await
внутри моего Task.Run
? Что-то вроде:
_taskQueue[i] = Task.Run(async () => await Process());
Подумав об этом, я не уверен. ContinueWith
срабатывает правильно, когда задача завершена, поэтому, возможно, в этом нет необходимости.
Я спрашиваю, потому что хотел отслеживать и регистрировать, сколько времени занимает выполнение каждой задачи.
Поэтому вместо Process () я бы сделал другой метод, например:
async Task DoProcess()
{
var sw = Stopwatch.StartNew();
Process();
sw.Stop();
Log(sw.ElapsedMilliseconds);
}
И мне пришло в голову, что если я это сделаю, я не был уверен, нужно ли мне await Process();
или нет, в дополнение к тому, что я не знал, стоит ли мне ждать внутри Task.Run()
Я немного ошарашен по этому поводу. Кто-нибудь может предложить руководство?
Редактировать:
Подводя итог:
Если сомометод:
void SomeMethod() { }
Тогда
Task.Run(() => SomeMethod());
отлично, вызывает SomeMethod в новом «потоке» (не технически, но вы понимаете, что я имею в виду).
Однако мой SomeMethod
на самом деле:
async Task SomeMethod() { }
Вам нужно сделать что-то особенное с Task.Run()
?
Мой код, я не являюсь, я просто прямо игнорирую, что это асин c Задача, и это, кажется, работает:
Task.Run(() => SomeMethod()); // SomeMethod is async Task but I am ignoring that
Но я не уверен, что это а) должно работать или б) хорошая идея. Альтернативой может быть:
Task.Run(async() => await SomeMethod());
Но есть ли смысл? И это усугубляется тем фактом, что я действительно хочу сделать:
Task.Run(() =>
{
someCode();
var x = startTimer();
SomeMethod();
var y = stopTimer();
someMoreCode()
});
, но без ожидания я не уверен, что он будет ждать, пока некий метод завершится sh и таймер будет неправильным.