簡體   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