Я (думаю, что я) понимаю различия между потоками и задачами.
- Потоки позволяют нам делать несколько вещей параллельно (они связаны с процессором).
- Асинхронныйзадачи высвобождают процессорное время, пока выполняются некоторые операции ввода-вывода (они связаны с вводом-выводом).
Теперь, скажем, я хочу выполнять несколько асинхронных задач параллельно.Например, я хочу загрузить несколько страниц постраничного ответа одновременно.Или я хочу записать новые данные в две разные базы данных.Как правильно обрабатывать потоки?Должны ли они быть асинхронными и ожидаемыми?Или асинхронная операция может быть только внутри потока?Как лучше всего обрабатывать ошибки?
Я пытался создать свой собственный служебный метод для запуска нового асинхронного потока, но у меня есть ощущение, что он может пойти не так, как надо.
public static Task<Thread> RunInThreadAsync<T>(T actionParam, Func<T, Task> asyncAction)
{
var thread = new Thread(async () => await asyncAction(actionParam));
thread.Start();
return thread;
}
Это нормально?Или метод должен быть public static async Task<Thread>
?Если да, что следует ожидать?Там нет thread.StartAsync()
.Или я должен использовать Task.Run
вместо этого?
Примечание: Использование await Task.WhenAll
или аналогичных подходов без явного нового потока не вариант для меня.Рабочий поток запускается в фоновом режиме (чтобы не блокировать основной поток), а затем обрабатывается другими службами в системе.