繁体   English   中英

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

[英]Understanding context in .Net Task execution

我一直试图理解.Net中任务执行中上下文的概念。 但是,我仍然无法将context与OS线程的基本概念相关联。 在浏览此博客时 ,我对上下文是什么有以下想法:

在GUI应用程序中,有一个包含所有GUI元素的GUI线程。 现在,因为需要进入GUI线程才能访问GUI元素,所以我假设GUI线程在其堆栈空间中初始化了GUI元素,并且该堆栈不与其他线程共享。 因此, awaitable需要调度的GUI线程的功能的其余部分,如果余数的函数要访问某些GUI元素。 同样,如果我们谈论接受HTTP get / post请求的HTTP应用程序,则有一个线程在请求​​到达时产生。 该线程包含请求上下文,例如用户的IP地址。 现在,如果其余函数要访问某些HTTP上下文属性,则必须在该线程中执行。

在阅读此博客时 ,我遇到了context being copied的想法。 这使我相信以下几点:

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

谁能为我澄清一下吗? 在上下文中到底是什么? 以及上下文如何转移? 上面对我的理解中哪一个是对的,或者两者都是错误的?


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

每个上下文都是不同的。 但通常,它们不会被复制 上下文用于计划 Tasks 也就是说,根据需要找到合适的线程其他资源,然后执行任务。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM