.Net AsyncStateMachine пользовательские реализации реализации - PullRequest
0 голосов
/ 18 декабря 2018

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

1) Я видел, что в зависимости от того, как я строю (Debug / Release), конечный автомат получаетскомпилирован в структуру или класс.Можно ли поручить компилятору всегда генерировать класс, несмотря ни на что?

2) Я видел, что void SetStateMachine (IAsyncStateMachine m) вообще не вызывается, даже если в документации сказано, что есликонечный автомат - это структура, он должен вызываться с коробочной версией.

3) Я сделал мой конструктор методов классом.Должен ли я сделать это структурой?Каков наилучший метод для этого?

4) Странно, но GetAwaiter иногда называют ПОСЛЕ строителя. Вызывается метод SetResult.Это нормальное поведение?если мы проверим декомпилированную версию Задачи, мы ясно увидим, что она сначала запрашивает ожидающего, а если ожидающий не завершен, она вызывает состояние машины AwaitOnCompleted / AwaitUnsafeOnCompleted.

Среда: .Net Core 2.1

Большое спасибо!

1 Ответ

0 голосов
/ 04 января 2019

Отвечая на ваши вопросы 1 и 3, вы можете сослаться на код компилятора Roslyn для asyncRewriter

Выбор структуры или класса для перезаписи определяется статусом EditAndContinue

// The CLR doesn't support adding fields to structs, so in order to enable EnC in an async method we need to generate a class.
var typeKind = compilationState.Compilation.Options.EnableEditAndContinue ? TypeKind.Class : TypeKind.Struct;

Ссылка

...