var httpResponseMessage = await httpClient.SendAsync(message).ConfigureAwait(false);
var dataStream = await httpResponseMessage.Content.ReadAsStreamAsync();
これはアイデアによるものですが、何が実行されてもメソッドが存在し、UIに戻ります。応答が到着すると実行が再開されますが、実際には実行されていないときにUIがすでにその実行を更新しています。 すべての呼び出しメソッドが待機されています。HttpClientt.SendAsync does not wait/lock実行
初期の方法は、その呼び出しは、UIが進行して更新する必要があります終えたが、2番目のhttpClient.SendAsync
が実行されると、実行がUIに戻り、HTTPClientのトリガーとなるUIメソッドの実行サービスを開始し、設計(Task.Run(() => StartDownload(selectedSchedules));
で待望されていない
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);
}
}
}
コールチェーン追加された無関係なコードがメソッドから削除されました
が、これは –
asyncを指定するためにセットにしてください走った方法でした(Task.Run()を使用するもの)のソースコードを提供する –
@BenSteeleはい、httpclientを使用する必要があります。 –