Этот вопрос предназначен для учебных целей.Я точно не занимаюсь разработкой.
У меня есть две длительные операции с привязкой к процессору (JobA
и JobB
).Оба не взаимодействуют с GUI.В отличие от Task.FromResult
, который завершается немедленно в выражении await, my Task.Run(()=>JobA()).ConfigureAwait(false)
возвращает управление вызывающей стороне и вызывает выполнение продолжения в потоке без GUI (из-за ConfigureAwait(false)
).
static void JobA()
{
for (int i = 0; i < int.MaxValue; i++) ;
}
static void JobB()
{
for (int i = 0; i < int.MaxValue; i++) ;
}
private static async Task Async()
{
await Task.Run(()=>JobA()).ConfigureAwait(false);
JobB();
//await Task.Run(() => JobB());
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
await Async();
}
Вопрос
В моем понимании, перенос JobB
с Task.Run
, как во втором случае ниже, не является необходимым, потому что продолжение уже гарантированно будет работать в потоке без GUI.
private static async Task Async()
{
await Task.Run(()=>JobA()).ConfigureAwait(false);
JobB();
}
private static async Task Async()
{
await Task.Run(()=>JobA()).ConfigureAwait(false);
await Task.Run(() => JobB());
}
Exception
поведение в асинхронном режиме немного сложнее, поэтому я задаю этот вопрос, потому что я хочу знать, рискованно ли исключение при возникновении исключения.Если такого риска нет, я удалю этот вопрос.