繁体   English   中英

如果Task.run可以实现异步等待,为什么还要使用异步等待

[英]Why use async await if same can be achieved by Task.run

以下两种方法的行为是否相同? 它们的工作方式是否存在内部差异? 延迟结束后,这两种方法都将释放UI线程并继续执行。

    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

异步编程和异步

async和await关键字不会导致创建其他线程。 异步方法不需要多线程,因为异步方法不会在自己的线程上运行。 该方法在当前同步上下文上运行,并且仅在该方法处于活动状态时才在线程上使用时间。

您不需要为任务使用System.Threading。 下面的代码是因为CancellationToken而做的。

与Task的区别在于,您可以访问主(UI)线程上的属性。

请参阅数量。 您甚至可以写主线程,但可能不是一个好习惯。

    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;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM