На моем веб-сервере (ASP.NET MVC 4) я вызываю веб-службы (asmx) на другом сервере. Я создал клиента из WSDL. Существуют методы синхронизации и асинхронные методы (обратные вызовы, а не задачи).
Я преобразовываю его в ориентированный на задачу вызов (с помощью TaskCompletionSource
), а затем вызываю await
следующим образом:
public async Task<DataObject> GetData()
{
var tcs = new TaskCompletionSource<DataObject>();
var client = new WebServiceClient();
client.GetDataCompleted += (sender, args) => tcs.SetResult(args.Result);
client.GetDataAsync();
return await tcs.Task;
}
После этого я везде использую async
/ await
. Есть ли в этом смысл? Я думаю, что когда вызывается веб-сервис, я сохраняю одну ветку с этим подходом - я прав? Клиент веб-службы блокирует поток при асинхронной загрузке? Если это так, я мог бы вместо этого использовать метод синхронизации:
public DataObject GetData()
{
var client = new WebServiceClient();
return client.GetData();
}
Благодарность
Кстати: я использую ASP.NET MVC 4, ориентируясь на .NET 4 (потому что мне нужно). Для совместимости async
/ await
я использую библиотеку Microsoft.Bcl.Async.
1 ответ
Вы правы в том, что использование асинхронного ввода-вывода «сохраняет» один поток во время его работы. Это главное преимущество асинхронного ввода-вывода на сервере. Я уже писал о плюсах и минусах асинхронного ввода-вывода. (Также: https://stackoverflow.com/a/12796711/122718).
Что вы должны сделать? Если эта веб-служба имеет тенденцию реагировать медленно или иногда рискует медленно реагировать, асинхронный режим является весьма привлекательным. Изображение 10 запросов поступает в секунду и веб-служба имеет задержку 10 с (возможно, из-за проблем с производительностью). Затем вам нужно 100 потоков только для обслуживания этой нагрузки.
С другой стороны, если вы этого не боитесь, async ничего вам не даст. Вы экономите несколько МБ стековой памяти, которая, скорее всего, вам не понадобится. Вы также сжигаете больше ЦП с помощью async. Вы становитесь менее продуктивным (особенно потому, что теперь вам нужно сделать всех вызывающих этот метод также асинхронными. Асинхронный режим является вирусным).
Похожие вопросы
Связанные вопросы
Новые вопросы
.net
НЕ используйте для вопросов о .NET Core - используйте вместо этого [.net-core]. .NET Framework - это программная среда, предназначенная главным образом для операционной системы Microsoft Windows. Он включает в себя реализацию библиотеки базовых классов, общеязыковой среды выполнения (обычно называемой CLR), общей системы типов (обычно называемой CTS) и динамической среды исполнения. Он поддерживает множество языков программирования, включая C #, VB.NET, F # и C ++ / CLI.
async
/await
в ASP.NET 4.0 (даже если вы используете библиотеку Microsoft.Bcl.Async), потому что для них требуется обновленныйAspNetSynchronizationContext
, доступный только в ASP. .NET 4.5. Дополнительная информация здесь .