Методы Span <T>и asyn c - PullRequest
       26

Методы Span <T>и asyn c

4 голосов
/ 06 августа 2020

Я прочитал несколько статей о Span<T>ReadOnlySpan<T>) и о том, как их нельзя использовать в асинхронных c методах.

Было отличное видео Chanel 9 Джареда Парсонса, где он показал следующий пример:

static async Task<bool> IsCSharpIdentifierAsync(Memory<char> memory, StreamReader reader)
{
    var count = await reader.ReadAsync(memory);
    return IsCSharpIdentifier(memory.Span.Slice(0, count));
}

static bool IsCSharpIdentifier(ReadOnlySpan<char> value)
{
   ....
}

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

Теперь у меня мало или вообще никаких знаний о компиляции, но я понимаю, что компилятор может (в определенных случаях) «встроенные» методы ( т.е. копировать код из вызываемого метода в вызывающий метод), чтобы уменьшить накладные расходы на вызов метода.

Я предполагаю, что ответ будет «snort ... конечно, нет», но есть ли вероятность, что компилятор может встроить метод с использованием Span в метод asyn c? Если так, то, как я понимаю, это приведет к проблемам .... (включая "локальные методы")

1 Ответ

5 голосов
/ 06 августа 2020

Компилятор C# никогда не встраивает методы; JIT может это сделать, но это отдельный уровень. Что мешает вам использовать структуры ref locals / ref в методе async, так это тот факт, что locals, возможно, придется переписать как поля. Но JIT-встраивание никогда не будет создавать поля - он будет применяться только для значений на основе локального стека, а значения на основе локального стека подходят для значений ref - поскольку вы явно не собираетесь иметь await в середине вашего синхронного IsCSharpIdentifier кода.

Итак: не паникуйте c - компилятор и JIT увидят вас здесь в порядке.

...