注意:请在标记为重复之前阅读完整篇文章。我已经阅读了其他答案,它们似乎没有回答我的问题。
我看过各种图片和人们指出并说多线程与异步编程不同,通过给出各种类比,如餐厅工人等。但我还没有看到实际示例的区别。
我在C#中尝试了这个:
using System;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
namespace AsyncTest
{
class Program
{
static void RunSeconds(double seconds)
{
int ms = (int)(seconds * 1000);
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Console.WriteLine($"Thread started to run for {seconds} seconds");
Thread.Sleep(ms);
stopwatch.Stop();
Console.WriteLine($"Stopwatch passed {stopwatch.ElapsedMilliseconds} ms.");
}
static async Task RunSecondsAsync(double seconds)
{
int ms = (int)(seconds * 1000);
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
Console.WriteLine($"Thread started to run for {seconds} seconds");
await Task.Run(() => Thread.Sleep(ms));
stopwatch.Stop();
Console.WriteLine($"Stopwatch passed {stopwatch.ElapsedMilliseconds} ms.");
}
static void RunSecondsThreaded(double seconds)
{
Thread th = new Thread(() => RunSeconds(seconds));
th.Start();
}
static async Task Main()
{
Console.WriteLine("Synchronous:");
RunSeconds(2.5); RunSeconds(2);
Console.WriteLine("\nAsynchronous:");
Task t1 = RunSecondsAsync(2.5); Task t2 = RunSecondsAsync(2);
await t1; await t2;
Console.WriteLine("\nMultithreading:");
RunSecondsThreaded(2.5); RunSecondsThreaded(2);
}
}
}
结果:
Synchronous:
Thread started to run for 2.5 seconds
Stopwatch passed 2507 ms.
Thread started to run for 2 seconds
Stopwatch passed 2001 ms.
Asynchronous:
Thread started to run for 2.5 seconds
Thread started to run for 2 seconds
Stopwatch passed 2002 ms.
Stopwatch passed 2554 ms.
Multithreading:
Thread started to run for 2.5 seconds
Thread started to run for 2 seconds
Stopwatch passed 2000 ms.
Stopwatch passed 2501 ms.
他们在行为上本质上产生了相同的结果。因此,多线程程序与异步程序的行为有何不同,我会在何时发现这些差异?
我还有其他各种问题要解决:
例如,在这张图片中: 我不理解的是,当您运行异步程序时,它的行为几乎与多线程程序相同,因为它似乎花费了类似的时间。如上图所示,它正在“间歇性”地处理异步任务。如果是这样,那么异步任务完成的时间不应该更长吗?
比方说,运行一个原本需要3秒钟同步完成且锁定其他任务的异步任务,那么在从我的原始任务中休息并执行其他任务的同时,我不应该期望这些任务需要更长时间才能完成吗?
那么为什么通常异步情况下需要与同步情况下一样的时间(即通常的3秒)?而且为什么程序会变得“响应迅速”:如果任务没有在单独的线程上执行,为什么在同时处理其他任务时只需3秒钟就能完成任务?
我对在餐厅使用工人的示例(参见顶部答案)的问题是,在餐厅里,烹饪是由烤箱完成的。在计算机中,这个比喻并没有太多意义,因为不清楚为什么烤箱没有被视为单独的“线程”,而是人/工人。
此外,多线程应用程序是否会使用更多内存?如果确实如此,是否可能创建一个简单的应用程序(最好与上面的应用程序尽可能相似),以证明它确实会使用更多内存?
有点冗长的问题,但多线程和异步编程之间的区别远非清晰明了。