var httpResponseMessage = await httpClient.SendAsync(message).ConfigureAwait(false);
var dataStream = await httpResponseMessage.Content.ReadAsStreamAsync();
Cette idée devrait être attendue, mais peu importe ce qu'il fait, exécute la méthode et retourne à l'interface utilisateur. L'exécution reprend lorsque les réponses arrivent, mais à ce moment-là, l'interface utilisateur a déjà mis à jour l'exécution terminée, alors que ce n'est pas le cas. Toutes les méthodes d'appel sont attendues.HttpClientt.SendAsync n'attend pas/verrouille l'exécution
méthode initiale n'est pas attendu par la conception (Task.Run(() => StartDownload(selectedSchedules));
qui démarre les services d'exécution de la méthode de l'interface utilisateur qui déclenche httpclient, lorsque cet appel a terminé l'interface utilisateur doit mettre à jour avec le progrès, mais la deuxième httpClient.SendAsync
est exécuté, l'exécution retourne à l'assurance-chômage
Task.Run(() => StartDownload(selectedSchedules)); //First call, initiated by a button
public async Task StartDownload(SchedulesList list)
{
//var t = new Task(() => _scheduleServices.Download(list));
//t.Start();
//await t;
await _scheduleServices.DownloadIwcfDb(list, UsbInfoModels);
}
public async Task Download(SchedulesList schedulesList)
{
await DownloadDb(schedulesList);
}
private async Task DownloadDb(SchedulesList schedulesList)
{
using (var httpClient = new HttpClient())
{
var message = new HttpRequestMessage(new HttpMethod("POST"), ApiCallUrls.GetIwcfSchedules)
{
Content = new StringContent(JsonConvert.SerializeObject(schedulesList), Encoding.UTF8, "application/json")
};
httpClient.Timeout = TimeSpan.FromMinutes(20);
var httpResponseMessage= await httpClient.SendAsync(message).ConfigureAwait(false);
var dataStream = await httpResponseMessage.Content.ReadAsStreamAsync();
using (Stream contentStream = dataStream, stream = new FileStream(Path.Combine(Directories.SomEDir, Directories.SomeFileName), FileMode.Create, FileAccess.Write, FileShare.None))
{
await contentStream.CopyToAsync(stream);
}
}
}
Chaîne d'appel Ajout d'un code non pertinent supprimé des méthodes
La méthode choisie ce couru dans le jeu pour être async –
s'il vous plaît fournir le code source de la fonction d'appel (celui utilisant le 'Task.Run()') –
@BenSteele oui, doit être d'utiliser httpclient, chaîne d'appel ajoutée –