Понимание контекста в выполнении задачи .Net - PullRequest
0 голосов
/ 28 ноября 2018

Я пытался понять концепцию контекста в выполнении задач в .Net.Однако я все еще не могу связать context с базовой концепцией потоков ОС.Проходя через этот блог , я как бы получил следующее представление о том, что такое контекст:

В приложениях с графическим интерфейсом существует единственный поток с графическим интерфейсом, который имеет все элементы графического интерфейса.,Теперь, поскольку для доступа к элементам GUI необходимо войти в поток GUI, я предполагаю, что поток GUI имеет инициализированные в своем стеке элементы GUI, которые он не разделяет с другими потоками.Поэтому awaitable необходимо запланировать остаток функции в потоке GUI, если функция остатка хочет получить доступ к некоторому элементу GUI.Точно так же, если мы говорим о приложении HTTP, которое принимает HTTP-запросы get / post, существует поток, который создается при получении запроса.Этот поток содержит контекст запроса, такой как IP-адрес пользователя.Теперь, если функция остатка хочет получить доступ к некоторым свойствам контекста HTTP, она должна выполняться в этом потоке.

Читая этот блог , я натолкнулся на идею context being copied.Это заставило меня поверить в следующее:

Контекст потока - это элементы данных, такие как IP-адрес, элементы графического интерфейса и т. Д. Когда остаток функции запланирован после ожидаемого завершения, остаток можетнужен контекст, чтобы присутствовать, но не обязательно в том же потоке.Итак, что делается, так это то, что любой поток извлекается из пула потоков, и контекст копируется в этот поток, чтобы он был доступен.После этого функция остатка планируется в этом потоке.Это может вызвать тупик следующим образом.Взять, к примеру, приложения с графическим интерфейсом.В любое время должен быть уникальный поток, имеющий контекст GUI.Итак, если поток графического интерфейса блокирует и не освобождает контекст, функция остатка не будет запланирована.

Может кто-нибудь объяснить это мне?Что именно в контексте?И как переносится контекст?Какое из приведенного выше понимания является правильным или оба неверны?


ОБНОВЛЕНИЕ: Я прочитал этот блог и в нем есть строка And this extension method demonstrates how to invoke a function with a specified ExecutionContext (typically, captured from another thread).Это подталкивает меня к мысли, что моя вторая идея ближе к правильности.

1 Ответ

0 голосов
/ 28 ноября 2018

Каждый контекст отличается.Но в целом они не скопированы .Контексты используются для расписания Tasks.То есть, чтобы найти подходящий поток и других ресурсов, как требуется, и затем выполнить задачу.

В некоторых контекстах (GUI) наиболее важной вещью является поток.Существует один поток пользовательского интерфейса, поэтому любой Task, который контекст графика запрашивается для планирования, должен организовывать поток пользовательского интерфейса для выполнения этого Task.

В некоторых контекстах (ASP.Net до ядра), чтоважными являются "окружающие" объекты запроса / ответа / сеанса.Эти объекты могут быть доступны только одному потоку за раз, но любой поток может быть использован.Таким образом, контекст может использовать потоки пула потоков, но должен гарантировать, что он одновременно выполняет только один Task.

И в контексте по умолчанию нет ни специального потока, ни каких-либо других специальных ресурсов.Как и в контексте ASP.Net, приведенном выше, любой поток пула потоков может быть использован для выполнения Task, но он может планировать Task s так же быстро, как и пул потоков.

...