2013-11-18 3 views
2

Я пытаюсь быстро преобразовать пару наших вызовов WCF для использования асинхронных методов. Я по-прежнему новичок в использовании async/await в нашем коде (я в первую очередь веб-разработчик) и хочу узнать, дает ли мой подход некоторую выгоду.Является ли мое использование WCF асинк полезным?

В приведенном ниже коде мне все еще нужно вернуть результат вызывающему, поэтому вся операция сама по себе все еще «синхронна» в восприятии, но, похоже, не голодает текущая нить до ожидания, что это то, что я пытаюсь выполнить.

Несмотря на то, что мой вызывающий (в данном случае, главный) не является асинхронным (это не может быть), есть ли какая-либо польза в этом подходе? По сути, все, что я сделал, это использовать ключевые слова async/await и использовать метод Async WCF. Благодарю.

(The console.writelines только для тестирования)

class Program 
{ 
    static void Main(string[] args) 
    { 
     var result = WcfAsync(); 

     Console.WriteLine(result.Result); 
     Console.ReadLine(); 
    } 

    private async static Task<bool> WcfAsync() 
    { 
     using (var svc = new EmailVendorService.EmailVendorServiceWCFClient()) 
     { 
      Console.WriteLine(Thread.CurrentThread.ManagedThreadId); // Current thread ID 
      try 
      { 
       // long running task to vendor API 
       var result = await svc.ExecuteProgramAsync("SomeProgram", "start"); 

       Console.WriteLine(Thread.CurrentThread.ManagedThreadId); // Outputs different thread's ID 

       return result; 
      } 
      catch 
      { 
       return false; 
      } 
     } 
    } 
} 
+0

Кажется очень полезным для меня. –

+0

Yup, если 'ExecuteProgramAsync' действительно асинхронно, это кажется полезным. Боковое примечание: исключение из журнала по крайней мере. Не проглатывайте. –

+0

Да, пожалуйста, проигнорируйте «обработку исключений» :-) –

ответ

2

Если это то, что вы действительно собираетесь закончить, тогда нет никакой пользы. Вы сохраняете поток, используя WCF-клиент async, но затем вы блокируете поток в Main.

Однако, если ваше окончательное решение является проектом пользовательского интерфейса, то есть преимущество: вы можете избежать блокировки потока пользовательского интерфейса. Или, если ваше окончательное решение является веб-сайтом ASP.NET, тогда есть преимущество: вы сохраняете поток, используя async, но вам не нужно блокировать какие-либо потоки, чтобы это сделать. В настольных приложениях (например, в консольных/пользовательских приложениях) потоки довольно «дешевы». Основное преимущество async заключается в том, чтобы избежать блокировки пользовательского интерфейса (если таковой имеется).

Если вы выполняете несколько одновременных вызовов, то async может помочь сделать код более понятным. Но если это просто один вызов WCF в консольном приложении, то на самом деле нет никакой пользы.

+0

Это не будет в консольном приложении - я просто использовал это как тестовую кровать. Благодарю. –

0

Мы используем асинхр для длительного запущенного процесса, где вы не хотите, чтобы FreeZ интерфейс. Если вы используете метод Async

  1. Если у вас есть зависимая задача друг от друга, например. вычисление одного результата вы хотите положить в другой результат, то вам нужно imiment Async.
  2. Если вы задали вопрос, то он всегда будет полезен для использования метода Async.
  3. любая отдельная задача, которую вы должны ввести в метод async. что даст вам отзывчивый и богатый ui.
  4. Async также предоставляет вам токен времени для тайм-аута.

какая доза Async будет использовать пул потоков для выполнения вашей задачи. Который управляется .net fremwork.

Смежные вопросы