首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果Task.run可以实现异步等待,为什么还要使用异步等待

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

Stack Overflow用户
提问于 2018-06-07 02:59:17
回答 1查看 88关注 0票数 1

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

代码语言:javascript
复制
    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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-07 03:30:17

Asynchronous programming with async and await

等待async和

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

您不需要为任务使用System.Threading。下面的代码是由于CancellationToken的缘故。

一个不同之处在于,对于Task,您可以访问主(UI)线程上的属性。

请参见数量。您甚至可以写入主线程,但这可能不是一个好的做法。

代码语言:javascript
复制
    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;
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50727717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档