2016-02-22 3 views
1

Я пытаюсь добавить накладку загрузки, в то время как мое приложение делает вызов веб-службы api в фоновом потоке, но по какой-то причине оно не работает. Когда я использую следующий код, он работает, как ожидалось:Фоновая нить не работает при добавлении наложения

 Task.Factory.StartNew (

      () => { 
       Console.WriteLine ("Hello from taskA."); 
       System.Threading.Thread.Sleep(3000); 
      } 

     ).ContinueWith ( 
      t => { 
       loadingOverlay.Hide(); 

      }, TaskScheduler.FromCurrentSynchronizationContext() 
     ); 

Приведенный выше код записывает в консоль, а затем спит в течение 3 секунд, как ожидалось, а затем удаляет накладку. Однако, когда я добавляю вызов в репозиторий, он пропускает весь первый раздел и просто скрывает оверлей.

Новый код выглядит следующим образом:

  Task.Factory.StartNew (

      () => { 
       Console.WriteLine ("Hello from taskA."); 
       var user = userRepository.GetUserByEmail(EmailTextBox.Text); 
       System.Threading.Thread.Sleep(3000); 
      } 
      ).ContinueWith ( 
      t => { 
       loadingOverlay.Hide(); 

      }, TaskScheduler.FromCurrentSynchronizationContext() 
     ); 


    }; 

код в хранилище выглядит следующим образом:

using (var client = new HttpClient()) { 
    client.BaseAddress = _uri; 
    client.DefaultRequestHeaders.Accept.Clear(); 
    client.DefaultRequestHeaders.Accept.Add (new MediaTypeWithQualityHeaderValue ("application/json")); 
    HttpResponseMessage response = client.GetAsync(String.Format("GetUser?email={0}", email)).Result; 
     if (response.IsSuccessStatusCode) { 

      var jsonResponse = response.Content.ReadAsStringAsync().Result; 
      return JsonConvert.DeserializeObject<User> (jsonResponse); 

     } else { 
      return null; 
     } 
    } 

Любая помощь будет оценена - заранее спасибо

+0

Может быть, есть исключение, которое вам не хватает, потому что нигде не вы ждете для выполнения этой задачи, чтобы закончить с помощью 'Task.Wait()' –

ответ

0

Вы можете использовать ожидание & async ключевые слова.

var user = await userRepository.GetUserByEmail(EmailTextBox.Text); 
loadingOverlay.Hide(); 

Await ключевое слово просто означает, что вы ждать ответа от GetUserByEmail до того excuting следующего строки кода.

вам нужно сделать то же самое для этой линии вместо .Result

HttpResponseMessage response = await client.GetAsync(String.Format("GetUser?email={0}", email)); 

Не забудьте поставить асинхронной ключевое слово на вас метод веб-вызова.

С помощью этого ключевого слова ожидания вам нужно поставить async в свой метод, который использует ключевое слово ожидания.

больше о асинхронном & ждут: https://msdn.microsoft.com/en-us/library/hh191443.aspx

+0

Ok им будет давать что попробовать - Спасибо. – RTaylorFord

+0

Привет, сработал: D Спасибо – RTaylorFord

+0

отлично! просто ответьте на мой вопрос, это поможет другим людям быстро ответить на подобную проблему. – OrcusZ

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