代码之家  ›  专栏  ›  技术社区  ›  Zeus

如果task.run可以实现,为什么要使用async await

  •  1
  • Zeus  · 技术社区  · 6 年前

    下面两种方法的行为是否相同?它们的工作方式有内在的区别吗?两个方法都将释放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
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   paparazzo    6 年前

    Asynchronous programming with async and await

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

    你不需要系统。任务的线程。下面的代码是因为cancellationtoken。

    一个不同之处在于,您可以访问主(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;
        }