Зачем использовать асинхронное ожидание, если та же задача может быть достигнута Task.run - PullRequest
0 голосов
/ 06 июня 2018

Оба метода ниже ведут себя одинаково?Есть ли внутренняя разница в том, как они работают?Оба метода освободят поток пользовательского интерфейса и продолжат выполнение после окончания задержки.

    public async Task DoSomethingAsync()
    {
        Console.WriteLine("Test Async start");
        //Any long running operation
        await Task.Delay(5000);
        Console.WriteLine("Test Async end");
    }

    public void TestTask()
    {
        Console.WriteLine("Test Task start");

        Task.Run(() =>
            {    
                //Any long running operation                
                Thread.Sleep(10000);
            }
        ).ContinueWith((prevTask) =>
        {
            Console.WriteLine("Test Task end");
        });
    }

**output**:
Test Async start
Test Task start
Test Async end
Test Task end

1 Ответ

0 голосов
/ 06 июня 2018

Асинхронное программирование с асинхронностью и ожиданием

Ключевые слова асинхронности и ожидания не приводят к созданию дополнительных потоков.Асинхронные методы не требуют многопоточности, потому что асинхронный метод не выполняется в своем собственном потоке.Метод выполняется в текущем контексте синхронизации и использует время в потоке, только когда метод активен.

Вам не нужен System.Threading для задач.Приведенный ниже код делает это из-за CancellationToken.

Одно отличие состоит в том, что у Задачи есть доступ к свойствам в основном потоке пользовательского интерфейса.

См. Количество.Вы даже можете написать в основной ветке, но, вероятно, не очень хорошая практика.

    async Task<int> TaskDelayAsync(CancellationToken ct, IProgress<int> progress)
    {
        Debug.WriteLine(Quantity);
        int i = 0; 
        while (true)
        {               
            i++;
            //Debug.WriteLine(i);
            progress.Report(i);
            ct.ThrowIfCancellationRequested();
            await Task.Delay(500);
        }
        return i;
    }
...