Правильно ожидающий Task.Run с асинхронным лямбда-выражением - PullRequest
0 голосов
/ 09 июля 2019

поэтому у меня есть асинхронный метод, заключенный в Task.Run примерно так:

//SynchronisationContext = UI Thread
await Task.Run(async => 
{
    for (int i = 0; i < 100; i++)
    {
       var res = ComplicatedCalulation(); //Takes about 1 second
       await ThirdPartyLib.WriteToDatabase(res);
    }
});

Ожидает ли в приведенном выше коде асинхронный лямбда-кодили он просто ждет начала Task (т. е. немедленного возвращения)

Я знаю с Task.Factory.StartNew правильное использование

await Task.Factory.StartNew<Task>(async => await MyAsyncMethod()).Result

Этотакже верно для Task.Run ?

1 Ответ

0 голосов
/ 09 июля 2019

Ваш код будет ждать до конца вычислений с использованием механизма задач.Это не заблокирует ваш поток, но он не будет выполнять код после этой точки, пока все в вашем цикле не будет выполнено.

public static async Task Test()
{
    await Task.Run(async () => 
    {
        for (int i = 0; i < 10; i++)
        {
            await Task.Delay(TimeSpan.FromSeconds(1));
            Console.WriteLine($"inside {i}");
        }
    });
    Console.WriteLine("Done");
}

даст следующий вывод:

inside 0
inside 1
inside 2
inside 3
inside 4
inside 5
inside 6
inside 7
inside 8
inside 9
Done
...