我读了很多文章,还是不能理解这一部分。
请考虑以下代码:
private async void button1_Click(object sender, EventArgs e)
{
await Dosomething();
}
private async Task<string> Dosomething()
{
await Task.Run((() => "Do Work"));
return "I am done";
}
第一个问题:
当我单击按钮时,它将调用DoSomething并等待一个通过调用Task.run(如果我没有弄错的话)从线程池创建线程的任务,所有这些都是异步运行的。所以我创建了一个线程来完成我的工作,但它是异步完成的?但是考虑到我不需要返回任何结果,我只是希望在没有得到任何结果返回的情况下完成工作,是否真的需要使用Async/Await,如果需要,如何使用?
第二个问题:
当异步运行一个线程时,它是如何工作的?它是在主UI上运行,但在一个单独的线程上运行,还是在一个单独的线程上运行,并且在该方法内部异步运行?
最简单的方法做一个火灾和忘记方法在C#?
如果您不
>
如果您
因此,对
它是在主UI上运行,但在一个单独的线程上运行,还是在一个单独的线程上运行,并且在该方法内部异步运行?
异步代码有时意味着其他线程(参见Q&A异步vs多线程-有区别吗?)。也就是说,如果代码是在与UI线程分开的线程中执行的,或者它允许在UI线程恢复时继续处理,这很好,因为UI循环仍然可以在其他任务并行执行时更新屏幕,而不会冻结UI。
异步方法(即
您可能需要回顾以下其他Q&AS:
[...]但这是否意味着“async/await”将触发一个线程,而task.run也会触发一个线程,还是它们都是同一个线程?
使用
public Task<bool> SomeAsync()
{
// This way, this method either decides if its code is asynchronous or
// synchronous, but the caller can await it anyway!
return Task.FromResult(true);
}
但是请记住,任务不是一个线程。任务是要做的工作,而线程是工作者。当您的程序运行时,工作和员工将变得可用和不可用。在幕后,库会将您的作业分配给可用的工作人员,并且,由于创建新的工作人员是一项代价高昂的操作,它通常会倾向于通过线程池重用现有的工作人员。