Если мы хотим создать TaskCompletionSource<T>
на основе Task
, который не имеет Result
нам еще нужно обеспечить T
и установить фиктивное значение. Как это:Какой общий тип аргумента использовать для TaskCompletionSource, если результат не нужен на самом деле
Task SomethingAsync() {
var tcs = new TaskCompletionSource<?>();
tcs.SetResult(default(?)); //Can happen later as well, this is for demo purposes.
return tcs.Task;
}
Что лучший тип использовать для T
с точки зрения производительности?
Кажется, трудно ответить на этот вопрос исключительно из запуска микро-теста. Я полагаю, что ответ зависит от остальной части приложения. Например, если мы используем TaskCompletionSource<bool>
, что заставит JIT генерировать специализированный код и вызывать использование памяти. Но это не добавит использования памяти, если приложение уже использует задачи на основе boolean. Если мы используем TaskCompletionSource<object>
, мы можем использовать больше памяти для каждой задачи (или не в зависимости от времени выполнения).
Вот почему я считаю, что только один контрольный тест не может ответить на вопрос, и на него также должны ответить рассуждения.
Хорошая идея. Интересно, будут ли байты, bool и VoidResult сохранять любые байты из-за того, как выполняется макет объекта. Объекты 8 байт выровнены на 64 бит (я думаю). Кроме того, это заставляет новый набор jitted-кода для каждой сборки, которая делает это. – boot4life
@ boot4life Трудно ответить. 'TaskCompletionSource' имеет одно поле (хранит 'Task ') и заполняет 4 байта ОЗУ на x86. Любая дополнительная полезная нагрузка вытесняет зарезервированное пространство для следующего выравнивания по 4 байта. Но я действительно не знаю, как обрабатываются 0 байтов, такие как 'VoidResult'. Если это сделано правильно (возможно, это так), то это означает, что система может хранить «TaskCompletionSource » в одном пространстве с 4 байтами (не считая заголовков, специфичных для CLR), тогда как «TaskCompletionSource » и «TaskCompletionSource
В любом случае объект TaskCompletionSource не будет затронут, но размер задачи будет. В 4.6 я вижу одно поле «T result» в производном классе. Поэтому в идеале производная часть заканчивается пустым. –
boot4life