Вы должны указать функцию обратного вызова для повышения эффективности. Если FromAsync
имеет только IAsyncResult
для работы, он не может быть уведомлен о завершении этого асинхронного результата. Придется использовать событие для ожидания. Это блокирует поток (или регистрирует ожидание пула потоков, что не так уж и плохо).
Эффективный асинхронный ввод-вывод требует обратных вызовов на некотором уровне.
Если вы работаете в асинхронном режиме, я предполагаю, что вы делаете это, потому что у вас много одновременных вызовов или они очень длинные. По этой причине вам следует использовать более эффективный механизм.
Если у вас мало или долго выполняются вызовы, async никак не поможет вам с производительностью, но все же может упростить программирование с помощью графического интерфейса.
Так что это не правильно:
public async Task<double> RemoteTimeConsumingRemoteCall()
{
var timeConsumingCallDelegate = new TimeConsumingCallDelegate(service.TimeConsumingRemoteCall);
return await Task.Factory.FromAsync
(
timeConsumingCallDelegate.BeginInvoke(null, null),
timeConsumingCallDelegate.EndInvoke
);
}
Чтобы убедиться, что ваша реализация действительно не блокирует какой-либо поток, я бы сделал это: вставьте Thread.Sleep(100000)
на стороне сервера и выполните 1000 одновременных вызовов на клиенте. Вы должны обнаружить, что количество потоков не увеличивается.