2015-01-20 2 views
0

Я знаю, что его много спрашивали, но моя проблема заключается в том, что мой метод не будет ждать завершения запроса, даже несмотря на то, что я реализовал TaskCompletionSource, который должен был выполнить эту работу, но это не делает.Телефон Windows 8 Запрос RestSharp. Async/await

public DecksViewModel(bool local) 
{ 
    DList = new List<Deck>(); 

    if (local) 
     InitializeLocalDeckList(); 
    else 
    { 
     Dereffering(); 
    } 
} 

public async void Dereffering() 
{ 
    var e = await InitilaizeWebDeckList(); 
    List<DeckIn> decksIn = JsonConvert.DeserializeObject<List<DeckIn>>(e); 
    foreach (DeckIn d in decksIn) 
    { 
     Deck dadd = new Deck(); 
     dadd.CardCount = 0; 
     dadd.Name = d.name; 
     dadd.PicturePath = d.image; 
     dadd.InstallDirectory = false; 
     DList.Add(dadd); 
    } 

    DataSource = AlphaKeyGroup<Deck>.CreateGroups(DList, System.Threading.Thread.CurrentThread.CurrentUICulture, (Deck s) => { return s.Name; }, true); 
} 

public Task<String> InitilaizeWebDeckList() 
{ 
    var tcs = new TaskCompletionSource<string>(); 
    var client = new RestClient("blabla.com"); 
    var request = new RestRequest(""); 
    request.AddHeader("Authorization", "Basic blabla"); 
    client.ExecuteAsync(request, response => 
    { 
     test = response.Content; 
     tcs.SetResult(response.Content); 


    }); 
    return tcs.Task; 
} 

Так что, когда я называю конструктор DecksViewModel, я asyncally попытаться запросить данные с веб-сервера и заполнить модель. Дело в том, что соответствующее представление «не ждет» запроса для заполнения модели, поэтому оно отображается пустым. Я использую

List<AlphaKeyGroup<Deck>> DataSource 

заполнить LongListSelector через DataBinding. Но DataSource еще не установлен, когда он привязан. Надеюсь, вы сможете помочь

ответ

3

Вы вызываете метод async, не ожидая его внутри конструктора. Вот почему «он не ждет» (потому что ему нечего ждать).

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

Вы должны соответствующим образом пересмотреть свое решение. Вариант иметь async статический метод, который создает экземпляр и await S процедура:

public static async Task CreateInstance(bool local) 
{ 
    var model = new DecksViewModel(); 
    if (local) 
    { 
     await InitializeLocalDeckList(); 
    } 
    else 
    { 
     await Dereffering(); 
    } 
} 

Это позволит вам не использовать async void, который должен использоваться только в UI даже обработчиков.

Вы можете прочитать больше о других вариантах в Stephen Cleary's blog

+1

спасибо, это работает, если Dereffering возвращает задачу ... Спасибо, су очень много – Anon

0

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

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

Вы не можете использовать ожидание в конструкторах.