返回

c#-使用 thread.sleep() 时,异步编程如何与线程一起工作?

发布时间:2022-05-24 07:35:48 204
# flask

假设/前奏:

  1. 在前面的问题中,我们注意到了线程。睡眠阻止线程请参阅:何时使用任务。延迟,何时使用线程。睡觉
  2. 我们还注意到控制台应用程序有三个线程:主线程、GC线程和;终结器线程IIRC。所有其他线程都是调试器线程。
  3. 我们知道async不会启动新线程,而是在同步上下文上运行;仅当方法处于活动状态时才在线程上使用时间。https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/task-asynchronous-programming-model

设置:
在一个示例控制台应用程序中,我们可以看到兄弟代码和父代码都不受线程调用的影响。睡眠,至少直到等待被调用(如果进一步,则未知)。

var sw = new Stopwatch();
sw.Start();
Console.WriteLine($"{sw.Elapsed}");
var asyncTests = new AsyncTests();

var go1 = asyncTests.WriteWithSleep();
var go2 = asyncTests.WriteWithoutSleep();

await go1;
await go2;
sw.Stop();
Console.WriteLine($"{sw.Elapsed}");
        
Stopwatch sw1 = new Stopwatch();
public async Task WriteWithSleep()
{
    sw1.Start();
    await Task.Delay(1000);
    Console.WriteLine("Delayed 1 seconds");
    Console.WriteLine($"{sw1.Elapsed}");
    Thread.Sleep(9000);
    Console.WriteLine("Delayed 10 seconds");
    Console.WriteLine($"{sw1.Elapsed}");
    sw1.Stop();
}
public async Task WriteWithoutSleep()
{
    await Task.Delay(3000);
    Console.WriteLine("Delayed 3 second.");
    Console.WriteLine($"{sw1.Elapsed}");
    await Task.Delay(6000);
    Console.WriteLine("Delayed 9 seconds.");
    Console.WriteLine($"{sw1.Elapsed}");
}

问题:如果线程在线程期间被阻止执行。睡眠,它是如何继续处理父母和兄弟姐妹的?有人回答说这是后台线程,但我没有看到多线程后台线程的证据。我错过了什么?

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(2)
按点赞数排序
用户头像