了解.Net任务执行中的上下文

时间:2018-11-28 02:55:02

标签: c# asp.net async-await task synchronizationcontext

我一直试图理解.Net中任务执行中上下文的概念。但是,我仍然无法将context与OS线程的基本概念联系起来。在经历this blog的过程中,我对上下文是什么有以下想法:

  

在GUI应用程序中,只有一个GUI线程具有所有   GUI元素。现在,因为需要进入GUI线程才能   访问GUI元素,我假设GUI线程具有GUI   在其不共享的堆栈空间中初始化的元素   其他线程。因此,awaitable需要安排   如果其余函数在GUI线程中存在其余函数   想访问一些GUI元素。同样地,如果我们谈论HTTP   接受HTTP get / post请求的应用程序,有一个线程   当请求到达时产生。该线程包含请求上下文,例如用户的IP地址。现在,如果剩下的   函数要访问一些HTTP上下文属性,它必须在该线程中执行。

在阅读this blog时,我遇到了context being copied的想法。这使我相信以下内容:

  

线程的上下文是数据成员,例如IP地址,GUI元素   等等,当功能的其余部分在等待时间之后被调度   完成,其余的可能需要上下文,但不是   必须在同一线程上。所以,要做的是任何线程   从线程池中取出,并将上下文复制到该线程池中   线程,以便可访问。此后,余数函数为   预定在此线程上。这可以通过以下方式导致死锁。以GUI   例如应用程序。任何时候都应该有一个唯一的线程   具有GUI上下文。因此,如果GUI线程阻塞并且没有   释放上下文,其余函数将无法安排。

有人可以为我澄清一下吗?在上下文中到底是什么?以及上下文如何转移?上面对我的理解中哪一个是正确的还是两者都是错误的?


更新: 我读了this blog,它有一行And this extension method demonstrates how to invoke a function with a specified ExecutionContext (typically, captured from another thread)。这促使我相信我的第二个想法更接近正确性。

1 个答案:

答案 0 :(得分:2)

每个上下文都不同。但一般来说,它们不是复制。上下文用于计划 Tasks。也就是说,根据需要找到合适的线程,然后执行任务。

在某些上下文(GUI)中,最重要的是线程。有一个UI线程,因此要求GUI上下文安排的任何Task都必须安排UI线程执行该Task

在某些情况下(核心之前为ASP.Net),重要的是“环境”请求/响应/会话对象。这些对象一次只能由单个线程访问,但是可以使用 any 线程。因此,上下文可以使用线程池线程,但需要确保它一次仅执行一个Task

在默认上下文中,没有任何特殊线程或任何其他特殊资源。像上面的ASP.Net上下文一样,任何线程池线程都可以用于执行Task,但它可以像线程池将其调度一样快地调度Task