Поделиться через


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), он должен: а) иметь асинхронную сигнатуру и асинхронно маршалировать в соответствующий поток, если он изначально не был вызван в совместимом потоке. Рекомендуемый способ переключения на поток main:

await JoinableTaskFactory.SwitchToMainThreadAsync();

б) иметь синхронную сигнатуру и создавать исключение при вызове в неправильном потоке. В частности, ни один метод не может синхронно маршалировать работу в другой поток (блокируя, пока эта работа выполняется). Синхронных блоков в целом следует избегать, когда это возможно. 2. Если реализация уже отправленного общедоступного API должна вызывать асинхронный код и блокировать его завершение, она должна делать это по следующему простому шаблону:

JoinableTaskFactory.Run(async delegate {
    await SomeOperationAsync(...);
});
  1. Если вы когда-либо ожидаете работы, которая была начата ранее, эта работа должна быть присоединена. Например, одна служба запускает некоторые асинхронные операции, которые позже могут стать синхронно блокирующими:
JoinableTask longRunningAsyncWork = JoinableTaskFactory.RunAsync(async delegate {
    await SomeOperationAsync(...);
});

Затем эта асинхронная работа становится заблокированной:

longRunningAsyncWork.Join();

или, возможно,

await longRunningAsyncWork;

Однако обратите внимание, что этот дополнительный шаг не требуется, когда ожидание выполняется сразу после запуска асинхронной операции.

Конструкторы

JoinableTaskContext()

Инициализирует новый экземпляр JoinableTaskContext класса , предполагая, что текущий поток является потоком main и Current предоставляет средства для переключения на поток main из другого потока.

JoinableTaskContext(Thread, SynchronizationContext)

Инициализирует новый экземпляр класса JoinableTaskContext.

Свойства

Factory

Получает фабрику, которая создает присоединяемые задачи, которые не принадлежат к коллекции присоединяемых задач.

IsOnMainThread

Возвращает значение, указывающее, выполняется ли вызывающий объект в потоке main.

IsWithinJoinableTask

Возвращает значение, указывающее, выполняется ли вызывающий объект в контексте присоединяемой задачи.

MainThread

Получает основной поток, который может совместно использоваться задачами, созданными этим контекстом.

NoMessagePumpSynchronizationContext

Возвращает , который при применении подавляет любой SynchronizationContext поток сообщений, который может выполняться во время синхронных блоков вызывающего потока.

Методы

Capture()

Записывает контекст вызывающего абонента и сериализует его в виде строки, подходящей для приложения с помощью последующего вызова RunAsync(Func<Task>, String, JoinableTaskCreationOptions).

CreateCollection()

Создает коллекцию для задач, присоединяемых "на лету".

CreateDefaultFactory()

Создает фабрику без JoinableTaskCollection.

CreateFactory(JoinableTaskCollection)

Создает присоединяемую фабрику задач, которая автоматически добавляет все созданные задачи в коллекцию, которая может быть совместно присоединена.

Dispose()

Общий контекст, в котором присоединяемые задачи могут создаваться и взаимодействовать, чтобы избежать взаимоблокировки.

Dispose(Boolean)

Удаляет управляемые и неуправляемые ресурсы, хранящиеся в этом экземпляре.

GetHangReport()

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

IsMainThreadBlocked()

Возвращает значение, указывающее, заблокирован ли поток main для завершения вызывающей стороны.

IsMainThreadMaybeBlocked()

Возвращает очень вероятное значение, указывающее, заблокирован ли поток main для завершения вызывающей стороны. Это менее точно, если задача блокировки потока пользовательского интерфейса только начинается и еще не была заблокирована, или цепочка зависимостей только что удалена. Однако, в отличие от IsMainThreadBlocked(), эта реализация не блокируется и быстрее в сценариях с высоким уровнем конфликтов.

OnFalseHangDetected(TimeSpan, Guid)

Вызывается, когда предыдущий отчет о зависаниях имеет ложный сигнал тревоги.

OnHangDetected(TimeSpan, Int32, Guid)

Вызывается, когда предполагается зависание с участием потока main.

SuppressRelevance()

Скрывает все задачи JoinableTask, с которыми связан вызывающий объект, до тех пор, пока не будет удалено возвращаемое значение.

Явные реализации интерфейса

IHangReportContributor.GetHangReport()

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

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

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

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