我一直试图理解.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)
。这促使我相信我的第二个想法更接近正确性。
答案 0 :(得分:2)
每个上下文都不同。但一般来说,它们不是复制。上下文用于计划 Tasks
。也就是说,根据需要找到合适的线程和,然后执行任务。
在某些上下文(GUI)中,最重要的是线程。有一个UI线程,因此要求GUI上下文安排的任何Task
都必须安排UI线程执行该Task
。
在某些情况下(核心之前为ASP.Net),重要的是“环境”请求/响应/会话对象。这些对象一次只能由单个线程访问,但是可以使用 any 线程。因此,上下文可以使用线程池线程,但需要确保它一次仅执行一个Task
。
在默认上下文中,没有任何特殊线程或任何其他特殊资源。像上面的ASP.Net上下文一样,任何线程池线程都可以用于执行Task
,但它可以像线程池将其调度一样快地调度Task
。