2014-09-01 4 views
3

Здравствуйте, я пытаюсь понять концепцию задачи и асинхронные методы. Я играл с этим кодом какое-то время, но безрезультатно. Может кто-нибудь, пожалуйста, скажите мне, как я могу получить возвращаемое значение из метода test() и присвоить это значение переменной?Как получить возвращаемое значение метода async?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 

    static void Main(string[] args) 
    { 

     Task test1 = Task.Factory.StartNew(() => test()); 
     System.Console.WriteLine(test1); 
     Console.ReadLine(); 
    } 

    public static async Task<int> test() 
    { 
     Task t = Task.Factory.StartNew(() => { Console.WriteLine("do stuff"); }); 
     await t; 
     return 10; 
    } 
} 
} 
+0

Посмотрите статьи на моем [curah] (http://curah.microsoft.com/45553/asyncawait-general "асинхронные ждут Общего"). –

ответ

2

Чтобы получить значение из Task вы можете await задачу, которая асинхронно ожидает задачи для завершения, а затем возвращает результат. Другой вариант - вызвать Task.Result, который блокирует текущий поток до тех пор, пока результат не будет доступен. Это может вызвать deadlock в приложениях с графическим интерфейсом, но в консольных приложениях это нормально, потому что у них нет SynchronizationContext.

Вы не можете использовать await в методе Main, поскольку он не может быть async так один из вариантов является использование test1.Result:

static void Main(string[] args) 
{ 

    Task<int> test1 = Task.Factory.StartNew<int>(() => test()); 
    System.Console.WriteLine(test1.Result); // block and wait for the result 
    Console.ReadLine(); 
} 

Другой вариант заключается в создании async метод, который вы называете от Main и await задача внутри. Вам все равно придется блокировать ожидание завершения метода async, чтобы вы могли вызвать Wait() по результатам этого метода.

static void Main(string[] args) 
{ 
    MainAsync().Wait(); // wait for method to complete 
    Console.ReadLine(); 
} 

static async Task MainAsync() 
{ 
    Task<int> test1 = Task.Factory.StartNew<int>(() => test()); 
    System.Console.WriteLine(await test1); 
    Console.ReadLine(); 
} 
+0

Измените 'Task.Factory.StartNew' на' Task.Factory.StartNew 'для задач, выполняемых' test() '. Я обновил свое решение. –

+0

Ошибка в том, что 'Task' не имеет свойства' Result', но 'Task ' does. –

+3

При работе с 'async-await' используйте' Task.Run' вместо 'Task.Factory.StartNew'. –

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