【发布时间】:2017-08-21 14:59:58
【问题描述】:
var httpResponseMessage = await httpClient.SendAsync(message).ConfigureAwait(false);
var dataStream = await httpResponseMessage.Content.ReadAsStreamAsync();
这个想法应该被等待,但无论它做什么执行都存在方法并返回到 UI。当响应到达时执行恢复,但到那时 UI 已经更新了执行完成,而实际上它还没有。 等待所有调用方法。
设计不等待初始方法 (Task.Run(() => StartDownload(selectedSchedules)); 启动 UI 方法执行触发 httpclient 的服务,当该调用完成时 UI 应该随着进度更新,但第二个 httpClient.SendAsync 被执行,执行返回 UI
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);
}
}
}
添加了调用链,从方法中删除了不相关的代码
【问题讨论】:
-
这个运行的方法是否设置为异步
-
请提供调用函数的源代码(使用
Task.Run()的那个) -
@BenSteele 是的,必须使用 httpclient ,添加调用链
-
@FlorianMoser 添加了完整的调用链,发出了不必要的代码,因此有些方法看起来很轻量级
标签: c# async-await dotnet-httpclient