.net 异步方法在哪里运行?

.net 异步方法在哪里运行?,.net,asynchronous,threadpool,async-await,.net,Asynchronous,Threadpool,Async Await,我已经阅读了很多关于异步等待模式的文章,但是我仍然不确定异步方法(等待的方法)是否在UI线程上运行。 我总是以SynchronizationContext类“异步方法与被调用方在同一SynchronizationContext中运行”结束,这到底意味着什么 它是新创建的单独线程(我知道不是)还是线程池线程 当我阅读SynchronizationContext时,我看到它是某种排队的任务执行器,但这些任务在哪里执行?在线程池上 如果是,异步方法在线程池上执行,对吗?标记为async的方法在调用它的

我已经阅读了很多关于异步等待模式的文章,但是我仍然不确定异步方法(等待的方法)是否在UI线程上运行。 我总是以SynchronizationContext类“异步方法与被调用方在同一SynchronizationContext中运行”结束,这到底意味着什么

它是新创建的单独线程(我知道不是)还是线程池线程

当我阅读SynchronizationContext时,我看到它是某种排队的任务执行器,但这些任务在哪里执行?在线程池上


如果是,异步方法在线程池上执行,对吗?

标记为
async
的方法在调用它的线程上运行,直到它到达其中的第一个
wait
关键字

但是有一个例外:如果在到达
await
关键字时,等待的方法已经完成运行,那么执行将继续进行,而不切换线程

public async Task Method()
{
    Console.WriteLine(1);
    await Something();
    Console.Writeline(2);
}
在这种情况下,如果在线程A上调用该方法,那么也将从线程A打印1

然后进入下一条指令。 如果
某物
返回的
任务
已经完成,则在线程A上继续执行。 如果
某物
返回的
任务
仍在运行,则可以从以下任一位置打印2:

  • 再次执行线程A—如果存在强制执行此操作的SynchronizationContext(如在WPF或WinRT应用程序中)。简单地说,这是通过排队和调度要在线程A上执行的剩余代码(即第三条指令)来完成的
  • 在完全不同的线程B上

  • 关于您对ThreadPool的疑问:

    正如我们所看到的,
    async
    方法不能保证在线程池上运行。 只有一个
    任务.Run
    重载方法安排的工作肯定会在线程池上运行。 引用
    任务
    文档:

    对要在线程池上运行的指定工作进行排队,并返回该工作的任务句柄


    3将由线程池上的线程打印。

    标记为
    async
    的方法在调用它的线程上运行,直到到达其中的第一个
    wait
    关键字

    但是有一个例外:如果在到达
    await
    关键字时,等待的方法已经完成运行,那么执行将继续进行,而不切换线程

    public async Task Method()
    {
        Console.WriteLine(1);
        await Something();
        Console.Writeline(2);
    }
    
    在这种情况下,如果在线程A上调用该方法,那么也将从线程A打印1

    然后进入下一条指令。 如果
    某物
    返回的
    任务
    已经完成,则在线程A上继续执行。 如果
    某物
    返回的
    任务
    仍在运行,则可以从以下任一位置打印2:

  • 再次执行线程A—如果存在强制执行此操作的SynchronizationContext(如在WPF或WinRT应用程序中)。简单地说,这是通过排队和调度要在线程A上执行的剩余代码(即第三条指令)来完成的
  • 在完全不同的线程B上

  • 关于您对ThreadPool的疑问:

    正如我们所看到的,
    async
    方法不能保证在线程池上运行。 只有一个
    任务.Run
    重载方法安排的工作肯定会在线程池上运行。 引用
    任务
    文档:

    对要在线程池上运行的指定工作进行排队,并返回该工作的任务句柄

    3将由线程池上的线程打印

    我已经阅读了很多关于异步等待模式的文章,但是我仍然不确定异步方法(等待的方法)是否在UI线程上运行

    如果还没有,请查看my,它解释了
    async
    wait
    的线程行为

    当您调用
    async
    方法时,它会同步执行,直到它第一次
    等待一个不完整的操作为止。然后,
    async
    方法捕获当前“上下文”,并将其自身的其余部分安排在以后执行,然后返回

    稍后,当操作完成时,
    async
    方法的其余部分将计划在捕获的“上下文”上运行

    “上下文”是当前的
    SynchronizationContext
    ,除非它是
    null
    ,在这种情况下,它是当前的
    TaskScheduler
    。当您从UI线程调用
    async
    方法时,就有了一个UI
    SynchronizationContext
    ,它通过将工作发布到UI线程的消息循环来工作

    我已经阅读了很多关于异步等待模式的文章,但是我仍然不确定异步方法(等待的方法)是否在UI线程上运行

    如果还没有,请查看my,它解释了
    async
    wait
    的线程行为

    当您调用
    async
    方法时,它会同步执行,直到它第一次
    等待一个不完整的操作为止。然后,
    async
    方法捕获当前“上下文”,并将其自身的其余部分安排在以后执行,然后返回

    稍后,当操作完成时,
    async
    方法的其余部分将计划在捕获的“上下文”上运行


    “上下文”是当前的
    SynchronizationContext
    ,除非它是
    null
    ,在这种情况下,它是当前的
    TaskScheduler
    。当您从UI线程调用
    async
    方法时,您就有了一个UI
    SynchronizationContext
    ,它通过将工作发布到UI线程的消息循环来工作。

    所说的“async methods”是指带有async关键字的方法还是返回可以等待的任务的方法?我知道是后者,但我想澄清一下。签名上带有async关键字的方法“async methods”是指方法吗