JoinableTaskContext Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Общий контекст, в котором могут создаваться присоединенные задачи и взаимодействовать, чтобы избежать взаимоблокировок.
public ref class JoinableTaskContext : IDisposable, Microsoft::VisualStudio::Threading::IHangReportContributor
public class JoinableTaskContext : IDisposable, Microsoft.VisualStudio.Threading.IHangReportContributor
type JoinableTaskContext = class
interface IHangReportContributor
interface IDisposable
Public Class JoinableTaskContext
Implements IDisposable, IHangReportContributor
- Наследование
-
JoinableTaskContext
- Реализации
Комментарии
Существует три правила, которые следует строго соблюдать при использовании или взаимодействии с JoinableTasks: 1. Если метод имеет определенные требования к квартире потока (STA или MTA), он должен либо: a) иметь асинхронную сигнатуру и асинхронно маршалировать в соответствующий поток, если он изначально не вызывается в совместимом потоке. Рекомендуемый способ переключиться на основной поток:
await JoinableTaskFactory.SwitchToMainThreadAsync();
b) Имеет синхронную сигнатуру и создает исключение при вызове неправильного потока. В частности, не допускается синхронно маршалировать работу с другим потоком (блокировка при выполнении этой работы). Синхронные блоки, как правило, следует избегать всякий раз, когда это возможно. 2. Если реализация уже отправленного общедоступного API должна вызывать асинхронный код и блокировать его завершение, это необходимо сделать, следуя этому простому шаблону:
JoinableTaskFactory.Run(async delegate {
await SomeOperationAsync(...);
});
- Если когда-либо ожидая работы, которая была запущена ранее, эта работа должна быть присоединена. Например, одна служба запускает некоторую асинхронную работу, которая позже может стать синхронной блокировкой:
JoinableTask longRunningAsyncWork = JoinableTaskFactory.RunAsync(async delegate {
await SomeOperationAsync(...);
});
Затем асинхронная работа становится блокировкой:
longRunningAsyncWork.Join();
или, возможно, :
await longRunningAsyncWork;
Обратите внимание, что этот дополнительный шаг не нужен, когда ожидается сразу после запуска асинхронной операции.
Конструкторы
| Имя | Описание |
|---|---|
| JoinableTaskContext() |
Инициализирует новый экземпляр JoinableTaskContext класса, предполагая, что текущий поток является основным потоком и Current предоставит средства для переключения на основной поток из другого потока. |
| JoinableTaskContext(Thread, SynchronizationContext) |
Инициализирует новый экземпляр класса JoinableTaskContext. |
Свойства
| Имя | Описание |
|---|---|
| Factory |
Получает фабрику, которая создает присоединенные задачи, которые не принадлежат к коллекции задач, к которой можно присоединиться. |
| IsNoOpContext |
Возвращает значение, указывающее, не связан ли этот экземпляр с каким-либо основным потоком (например, созданным с CreateNoOpContext()). |
| IsOnMainThread |
Возвращает значение, указывающее, выполняется ли вызывающий объект в основном потоке. |
| IsWithinJoinableTask |
Возвращает значение, указывающее, выполняется ли вызывающий объект в контексте задачи, доступной для соединения. |
| MainThread |
Возвращает основной поток, который можно совместно использовать задачами, созданными этим контекстом. |
| NoMessagePumpSynchronizationContext |
SynchronizationContext Возвращает значение, которое при применении подавляет любой насос сообщений, который может выполняться во время синхронных блоков вызывающего потока. |
Методы
| Имя | Описание |
|---|---|
| Capture() |
Записывает контекст вызывающего объекта и сериализует его в виде строки, подходящей для приложения с помощью последующего вызова RunAsync(Func<Task>, String, JoinableTaskCreationOptions). |
| CreateCollection() |
Создает коллекцию для задач, доступных для присоединения в полете. |
| CreateDefaultFactory() |
Создает фабрику без JoinableTaskCollection. |
| CreateFactory(JoinableTaskCollection) |
Создает присоединенную фабрику задач, которая автоматически добавляет все созданные задачи в коллекцию, которую можно объединить совместно. |
| CreateNoOpContext() |
Инициализирует новый экземпляр класса, настроенный JoinableTaskContext для no-op вызовов SwitchToMainThreadAsync(CancellationToken). |
| Dispose() |
Общий контекст, в котором могут создаваться присоединенные задачи и взаимодействовать, чтобы избежать взаимоблокировок. |
| Dispose(Boolean) |
Удаляет управляемые и неуправляемые ресурсы, удерживаемые этим экземпляром. |
| GetHangReport() |
Предоставляет данные для отчета о зависаниях. |
| IsMainThreadBlocked() |
Возвращает значение, указывающее, заблокирован ли основной поток для завершения вызывающего элемента. |
| IsMainThreadMaybeBlocked() |
Получает весьма вероятное значение, блокируется ли основной поток для завершения вызывающего элемента. Это менее точно, когда задача блокировки потока пользовательского интерфейса только что запускается и еще не заблокирована, или цепочка зависимостей только что удалена. Однако, в отличие от IsMainThreadBlocked()этой реализации, эта реализация является бесплатной и быстрее в сценариях с высоким уровнем конфликтов. |
| OnFalseHangDetected(TimeSpan, Guid) |
Вызывается, когда предыдущий отчет о зависания имеет значение false alarm. |
| OnHangDetected(TimeSpan, Int32, Guid) |
Вызывается, когда подозревается, что зависание произошло с участием основного потока. |
| SuppressRelevance() |
Скрывает любой вызывающий объект JoinableTask, с которым не будет удалено возвращаемое значение. |
Явные реализации интерфейса
| Имя | Описание |
|---|---|
| IHangReportContributor.GetHangReport() |
Предоставляет данные для отчета о зависаниях. |
Применяется к
Потокобезопасность
Этот тип является потокобезопасной для всех членов.