Язык

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(...);
});
  1. Если когда-либо ожидая работы, которая была запущена ранее, эта работа должна быть присоединена. Например, одна служба запускает некоторую асинхронную работу, которая позже может стать синхронной блокировкой:
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()

Предоставляет данные для отчета о зависаниях.

Применяется к

Потокобезопасность

Этот тип является потокобезопасной для всех членов.