2015-06-13 3 views
2

У меня есть простой консольного приложенияждут/асинхронной странное поведение

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

namespace ConsoleApplication2 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      MockAPI api = new MockAPI(); 
      Task t = api.GetVersion(); 
      var placeBreakPoint = "breakpoint"; 
     } 
    } 

    public class MockAPI 
    { 
     public async Task<string> GetVersion() 
     { 
      return await APIVersion(); 
     } 

     private async Task<string> APIVersion() 
     { 
      await Task.Delay(3000); 
      return "v1.0"; 
     } 
    } 
} 

Когда я запустил этот первый раз, когда он выполняется, как я ожидаю увидеть код пройти весь путь к

await Task.Delay(3000); 

, а затем возвращаясь к

var placeBreakPoint = "breakpoint"; 

перед возвращением в

return "v1.0"; 

, когда задержка была завершена. Однако при запуске кода после этого код будет выполняться по-прежнему, но никогда не возвращается с Task.Delay. Мне не хватает чего-то фундаментального здесь.

ответ

1

Вы не дожидаетесь своей задачи, чтобы ваше приложение закончилось до того, как задача будет выполнена.

Вам необходимо Wait или await его (что вы не можете сделать в Main, но должны делать в другом месте).

static void Main(string[] args) 
{ 
    MockAPI api = new MockAPI(); 
    Task t = api.GetVersion(); 
    var placeBreakPoint = "breakpoint"; 
    t.Wait(); 
} 
+0

Почему это работает в первый раз? – user1054637

+0

@ user1054637 Что вы имеете в виду в первый раз? – i3arnon

+0

Я тестировал с Wait, и это работает, поэтому спасибо за это. Я имею в виду, когда я сначала запускал код, над которым я бежал, я видел возврат к методу APIVersion после того, как он попал в строку placeBreakPoint в Main, но только в первый раз. Последующие прогоны заканчиваются, как вы описали до того, как задача была выполнена. – user1054637

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