最佳答案
我认为它们基本上是同一件事——编写在处理器之间分配任务的程序(在有2个以上处理器的机器上)。然后我读到这,它说:
Async方法被设计为非阻塞操作。一个等待 表达式在异步方法中不会阻塞当前线程 等待的任务正在运行。相反,该表达式会标记其余部分 方法的延续,并将控制权返回给的调用者 异步方法。 async和await关键字不会导致额外的线程 创建。异步方法不需要多线程,因为Async 方法不在自己的线程上运行。该方法在电流上运行 对象时,才在线程上使用时间 方法是活动的。你可以使用Task。运行命令将cpu占用的任务移动到 后台线程,但是后台线程对进程没有帮助
我想知道是否有人能帮我翻译成英文。它似乎在异步性(有这个词吗?)和线程之间划出了界限,并暗示您可以有一个具有异步任务但没有多线程的程序。
现在我明白了异步任务的思想,如Jon Skeet的c#深度,第三版第467页的例子
async void DisplayWebsiteLength ( object sender, EventArgs e )
{
label.Text = "Fetching ...";
using ( HttpClient client = new HttpClient() )
{
Task<string> 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()
与x
或y
无关,将导致DisplayWebsiteLength()
“在后台”执行,就像
processor 1 | processor 2
-------------------------------------------------------------------
int x = 5; | DisplayWebsiteLength()
double y = Math.Pow((double)x,2000.0); |
显然这是一个愚蠢的例子,但我是正确的还是我完全糊涂了?
(另外,我对为什么sender
和e
从未在上述函数体中使用感到困惑。)