簡體   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