Представьте себе следующую ситуацию. Существует пользовательский интерфейс, и длительная операция должна вызываться без блокировки основного потока. длительная операция вызывает для себя некоторые другие методы, которые не взаимодействуют с потоком пользовательского интерфейса.
В большинстве случаев методы, вызываемые из метода B и C, имеют синхронные альтернативы своему Asyn c аналоги. Вопрос в том, могут ли они безопасно использоваться вместо их asyn c аналога? Допустим, DbContext.DbSet.Add вместо AddAsyn c
// UI
public async Task UiMethodAsync()
{
var result = await MethodAAsync();
}
// some component
public async Task<bool> MethodAAsync()
{
return await MethodBAsync().ConfigureAwait(false);
}
public async Task<bool> MethodBAsync()
{
return await MethodCAsync().ConfigureAwait(false);
}
public async Task<bool> MethodCAsync()
{
return await DbContext.Set<TEntit>.AnyAsync().ConfigureAwait(false);
}
Мой вопрос таков: необходимо ли сделать все методы асинхронными, чтобы предотвратить блокировку потока пользовательского интерфейса, или он будет достаточно хорош для создания Методы B и C синхронно выглядят так:
// UI
public async Task UiMethodAsync()
{
var result = await MethodAAsync();
}
// some component
public Task<bool> MethodAAsync()
{
return Task.FromResult(MethodB());
}
public bool MethodB()
{
return MethodC();
}
public bool MethodC()
{
return DbContext.Set<TEntit>.Any();
}
Конечно, это зависит от того, что делают MethodB и C, взаимодействуют ли они с потоком пользовательского интерфейса или нет. но допустим, что они этого не делают, а просто должны рассчитать вещи и вернуть результат.
Есть ли необходимость сделать их асинхронными? Я думаю, нет. Я думаю, что это, вероятно, позволяет избежать ненужных накладных расходов на управление задачами и потоками.