提问者:小点点

Async/Await是否使用Task.Run异步启动新线程?


我读了很多文章,还是不能理解这一部分。

请考虑以下代码:

    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上运行,但在一个单独的线程上运行,还是在一个单独的线程上运行,并且在该方法内部异步运行?


共3个答案

匿名用户

最简单的方法做一个火灾和忘记方法在C#?

匿名用户

如果您不或您IT,则会有很大的区别:

> 调用它:,但在尚未完成时执行下一句。

如果您IT:被调用,并且一旦完成,就执行下一个句子。

因此,对的需要将取决于您要如何调用:如果您不调用,就像将其称为fire&Amp;忘了路。

它是在主UI上运行,但在一个单独的线程上运行,还是在一个单独的线程上运行,并且在该方法内部异步运行?

异步代码有时意味着其他线程(参见Q&A异步vs多线程-有区别吗?)。也就是说,如果代码是在与UI线程分开的线程中执行的,或者它允许在UI线程恢复时继续处理,这很好,因为UI循环仍然可以在其他任务并行执行时更新屏幕,而不会冻结UI。

异步方法(即方法)是一种语法糖,它告诉编译器语句应被视为状态机。C#编译器将代码转换为状态机,在状态机中等待结果的代码在等待的代码之后执行。

您可能需要回顾以下其他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);
}

匿名用户

/code>类型要求您从任务返回一个。如果没有要返回的内容,可以使用(顺便提一下,它是

但是请记住,任务不是一个线程。任务是要做的工作,而线程是工作者。当您的程序运行时,工作和员工将变得可用和不可用。在幕后,库会将您的作业分配给可用的工作人员,并且,由于创建新的工作人员是一项代价高昂的操作,它通常会倾向于通过线程池重用现有的工作人员。