簡體   English   中英

Task.Run在異步和等待中的作用

[英]Role of Task.Run in async and await

我有一個用於異步和等待的簡單程序:

class Program
    {
        static void Main()
        {
           var demo = new AsyncAwaitDemo();
           Task.Run(() => {demo.DoStuff()};

           while (true)
           {
               Console.WriteLine("Doing Stuff on the Main Thread...................");
           }
        }
    }

    public class AsyncAwaitDemo
    {
        public async Task DoStuff()
        {
        await LongRunningOperation();

        }

        private static async Task<string> LongRunningOperation()
        {
            int counter;

            for (counter = 0; counter < 50000; counter++)
            {
                Console.WriteLine(counter);
            }

            return "Counter = " + counter;
        }
    }

我的第一個問題是:

  1. 是否必須在任何asyncawait方法中使用Task.Run ,因為我剛剛刪除了該程序,並且該程序變得同步了。線。

其次,

  1. 下面的代碼創建多少個線程?

    Task.Run(()=> {demo.DoStuff()};

    如果大於1,則線程數是否取決於內部操作,在此示例中,它是帶計數器的for循環。

我開始了解C#中的異步編程,閱讀並練習了一些示例。 除了上述要求外,我幾乎能夠弄清上下文。

async / awaitTask.Run沒有Task.Run ; 但是,它們在某些情況下可以很好地協同工作。

Task.Run在線程池線程上運行一些代碼。 async / await是一種代碼轉換,可讓您以更自然,更必要的方式編寫異步代碼(有關async工作原理的更多詳細信息,請參見我的async介紹 )。

是否必須在任何異步和等待方法中使用Task.Run,​​因為我剛剛刪除了該程序,因此程序變得同步了。

一點也不! async / await非常常見的沒有Task.Run 只要您執行真正的異步操作,就可以使用async / await 一般而言,任何基於I / O的方法都是自然異步操作的一個很好的例子。 因此,您可以僅使用async / await使用類似HttpClient.GetStringAsync東西,而無需任何Task.Run

但是請注意,在沒有await情況下使用async幾乎總是錯誤的。 編譯器會警告您LongRunningOperation ,並告知您它實際上不是異步的。

下面的代碼創建多少個線程? Task.Run(()=> {demo.DoStuff()};

該代碼只是將DoStuff排隊到線程池中。 線程池線程將執行DoStuff 線程創建取決於許多其他因素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM