![](/img/trans.png)
[英]Task.Run( () MethodName()) and await Task.Run(async () => MethodName())
[英]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;
}
}
我的第一個問題是:
Task.Run
,因為我剛剛刪除了該程序,並且該程序變得同步了。線。 其次,
下面的代碼創建多少個線程?
Task.Run(()=> {demo.DoStuff()};
如果大於1,則線程數是否取決於內部操作,在此示例中,它是帶計數器的for循環。
我開始了解C#中的異步編程,閱讀並練習了一些示例。 除了上述要求外,我幾乎能夠弄清上下文。
async
/ await
與Task.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.