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