异步编程和多线程之间有什么区别?

29 浏览
0 Comments

异步编程和多线程之间有什么区别?

我之前认为它们基本上是相同的东西 - 编写将任务分配给处理器的程序(在具有2个以上处理器的机器上)。然后我读到了这个网页,它说:

异步方法旨在进行非阻塞操作。在异步方法中使用await表达式时,不会阻塞当前线程,而是将剩余的方法部分作为继续项注册,并将控制权返回给异步方法的调用者。

async和await关键字不会创建额外的线程。异步方法不需要多线程,因为异步方法不在独立的线程上运行。该方法在当前同步上下文中运行,并且仅在方法活动时占用线程的时间。您可以使用Task.Run将计算密集型工作移到后台线程,但后台线程无法处理只等待结果可用的进程。

我想知道是否有人可以将其翻译成英文。它似乎在异步性(这个词存在吗?)和线程之间划定了界限,并暗示您可以创建一个具有异步任务但没有多线程的程序。

现在我理解了异步任务的概念,例如Jon Skeet的《C# In Depth, Third Edition》第467页的示例:

async void DisplayWebsiteLength ( object sender, EventArgs e )
{
    label.Text = "Fetching ...";
    using ( HttpClient client = new HttpClient() )
    {
        Task task = client.GetStringAsync("http://csharpindepth.com");
        string text = await task;
        label.Text = text.Length.ToString();
    }
}

async关键字的意思是“无论何时调用此函数,都不需要在调用后立即完成的上下文中调用它。”

换句话说,在某个任务的中间部分编写它

int x = 5; 
DisplayWebsiteLength();
double y = Math.Pow((double)x,2000.0);

由于DisplayWebsiteLength()xy没有关系,将会导致DisplayWebsiteLength()在“后台”执行,如下所示:

                处理器 1              |      处理器 2
-------------------------------------------------------------------
int x = 5;                                 |  DisplayWebsiteLength()
double y = Math.Pow((double)x,2000.0);     |

显然,这是一个愚蠢的例子,但我是正确的吗?还是我完全搞混了?另外,我不明白为什么上述函数的主体中从未使用过sendere

0