我最近正在阅读关于async/await的事情,我对以下事实感到困惑:我正在阅读的许多文章/帖子说明在使用异步等待时没有创建新线程(示例).
我创建了一个简单的控制台应用程序来测试它
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Main: " + Thread.CurrentThread.ManagedThreadId);
MainAsync(args).Wait();
Console.WriteLine("Main End: " + Thread.CurrentThread.ManagedThreadId);
Console.ReadKey();
}
static async Task MainAsync(string[] args)
{
Console.WriteLine("Main Async: " + Thread.CurrentThread.ManagedThreadId);
await thisIsAsync();
}
private static async Task thisIsAsync()
{
Console.WriteLine("thisIsAsyncStart: " + Thread.CurrentThread.ManagedThreadId);
await Task.Delay(1);
Console.WriteLine("thisIsAsyncEnd: " + Thread.CurrentThread.ManagedThreadId);
}
}
Run Code Online (Sandbox Code Playgroud)
以下代码的输出是:
Main: 8
Main Async: 8
thisIsAsyncStart: 8
thisIsAsyncEnd: 9
Main End: 8
Run Code Online (Sandbox Code Playgroud)
我错过了这一点,或者这个AsyncEnd是否具有与其他操作不同的线程ID?
编辑:
我已根据下面的答案更新了代码await Task.Delay(1),但我仍然看到相同的结果.
引用下面的答案:
Rather, it enables the …Run Code Online (Sandbox Code Playgroud) 我希望以一种易于理解的形式了解该声明的所有内容yield.
我已经阅读了关于yield实现迭代器模式时的语句及其简易性.但是,大部分都非常干燥.我想深入研究微软如何处理收益率.
另外,你什么时候使用收益率突破?
static async Task WaitTaskCompleted()
{
//Use Thread A before await Task.CompletedTask
await Task.CompletedTask;
//Will the code after await Task.CompletedTask always use Thread A, or there is chance to have a Thread B?
}
Run Code Online (Sandbox Code Playgroud)
这意味着await Task.CompletedTask将始终实际同步执行该方法?
这是我的事件处理程序代码:
protected async void TestrunSaveExecute()
{
bool saveResult = await SaveTestRunAsync();
}
Run Code Online (Sandbox Code Playgroud)
为了保持UI响应,我使用了async/ await方法.
根据我的理解,我现在可以在SaveTestRunAsync()不阻止UI的情况下进行一些冗长的操作,因为它通过使用await关键字解耦.
private async Task<bool> SaveTestRunAsync()
{
//System.Threading.Thread.Sleep(5000); --> this blocks the UI
await Task.Delay(5000); // this doesn't block UI
return true;
}
Run Code Online (Sandbox Code Playgroud)
你能否解释为什么Thread.Sleep仍然阻止用户界面的呼叫,而Task.Delay不是?