Ваш метод Lock
не понимает асин c делегатов, поэтому делегат асин c, который вы пытаетесь передать в качестве аргумента, обрабатывается как async void
. Асин c пустоты проблематичны c во всех отношениях, и следует избегать , если только они не используются по назначению в качестве обработчиков событий.
Чтобы гарантировать, что ваш метод понимать asyn c делегатов, вы должны создать перегрузку, которая принимает Func<Task>
в качестве аргумента:
private Task Lock(Func<Task> func)
{
return Task.Run(func);
}
Обратите внимание, что аргумент func
может быть передан непосредственно Task.Run
потому что этот метод также понимает asyn c делегатов. Не все встроенные методы понимают asyn c делегаты, с примечательными примерами Task.Factory.StartNew
и Parallel.ForEach
. Вы должны быть осторожны при каждом добавлении модификатора async
в делегат. Вы должны быть уверены, что вызываемый метод распознает asyn c делегатов, иначе вы можете получить asyn c пустоты и havo c, которые они создают.