2014-10-06 2 views
-1

Существует метод Async FuncAsync и объект Task t. Оба делают то же самое, используя пул потоков. В чем разница между этими двумя стратегиями?Async Task vs Task

class Program 
{ 
    private static async Task<int> FuncAsync(string str) 
    { 
     string s = await Task.Run(() => 
     { 
      Console.WriteLine("{0} <- Pooled? ID -> {1}", Thread.CurrentThread.IsThreadPoolThread, Thread.CurrentThread.ManagedThreadId); 
      // Thread.Sleep(1000); 
      return str; 
     }); 
     return s.Length; 

    } 

    public static void Main(string[] args) 
    { 
     Task<int> z = FuncAsync("Text"); 
     Console.WriteLine(z.Result); 
     Task<int> t = Task.Run(() => 
     { 
      Console.WriteLine("{0} <- Pooled? ID -> {1}", Thread.CurrentThread.IsThreadPoolThread, Thread.CurrentThread.ManagedThreadId); 
      // Thread.Sleep(1000); 
      return "Text".ToString().Length; 
     }); 
     Console.WriteLine(t.Result); 
     Thread.CurrentThread.Join(1000); 

     Console.ReadLine(); 

    } 
} 

Я думаю, что с помощью метода асинхронного ждет результата и не может быть близки без финишной задачи, и задачи - нити фон и может быть закрыт без финишной задачи.

+0

Не так много, за исключением того, что у вас есть анонимный метод и больше сантехники в случае 'Задачи'. – Mrchief

+4

Похоже, вам просто нужно прочитать вступительное руководство по 'async/await'. – Servy

+1

@Servy Я так думаю)) –

ответ

0

One - функция многократного использования, другая - нет. Один передает строку длина обратно через потоки, а другая передает всю строку. Ни один из них не работает асинхронно, потому что вы немедленно запрашиваете .Result, который блокируется до завершения задачи (вместо этого вы должны использовать await)

+0

Он не может использовать 'await' внутри' Main'. –

+1

Правда, но он не должен беспокоиться о Task.Run сразу же после выполнения задачи. Результат: –

+0

True ... true :) Я не думаю, что его код имеет много смысла. –