На моем веб-сервере (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.

2
Martin Volek 13 Авг 2014 в 18:09
Вы не можете использовать async / await в ASP.NET 4.0 (даже если вы используете библиотеку Microsoft.Bcl.Async), потому что для них требуется обновленный AspNetSynchronizationContext, доступный только в ASP. .NET 4.5. Дополнительная информация здесь .
 – 
Stephen Cleary
13 Авг 2014 в 21:35

1 ответ

Лучший ответ

Вы правы в том, что использование асинхронного ввода-вывода «сохраняет» один поток во время его работы. Это главное преимущество асинхронного ввода-вывода на сервере. Я уже писал о плюсах и минусах асинхронного ввода-вывода. (Также: https://stackoverflow.com/a/12796711/122718).

Что вы должны сделать? Если эта веб-служба имеет тенденцию реагировать медленно или иногда рискует медленно реагировать, асинхронный режим является весьма привлекательным. Изображение 10 запросов поступает в секунду и веб-служба имеет задержку 10 с (возможно, из-за проблем с производительностью). Затем вам нужно 100 потоков только для обслуживания этой нагрузки.

С другой стороны, если вы этого не боитесь, async ничего вам не даст. Вы экономите несколько МБ стековой памяти, которая, скорее всего, вам не понадобится. Вы также сжигаете больше ЦП с помощью async. Вы становитесь менее продуктивным (особенно потому, что теперь вам нужно сделать всех вызывающих этот метод также асинхронными. Асинхронный режим является вирусным).

1
Community 23 Май 2017 в 15:29