我尝试通过Windows服务(使用在线找到的“ TimedHostedService”)通过REST调用获取一些信息。我在“ StartAsync”中启动计时器,然后调用“ DoWork”方法。我将其作为“异步”方法命名为:
ICollection<Module> allModules = await client.GetModulesAsync();
此方法是由NSwag自动生成的(所以我想它是正确的:-))。 它使用HttpClient进行GET请求。 GetModulesAsync:
var urlBuilder_ = new System.Text.StringBuilder();
urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/Modules");
var client_ = _httpClient;
try
{
using (var request_ = new System.Net.Http.HttpRequestMessage())
{
request_.Method = new System.Net.Http.HttpMethod("GET"); request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("application/json"));
PrepareRequest(client_, request_, urlBuilder_);
var url_ = urlBuilder_.ToString();
request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute);
PrepareRequest(client_, request_, url_);
var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); //here it fails
...
当调用“ SendAsync”(最后一个代码行)时,它直接进入try-finally的“ final”。万一我将全部内容(包括DoWork和StartAsnc)复制到WinForms-App中,则一切正常。在WinForms-App中,我不是从IHostedService和IDisposable派生的,而是将其余所有内容保留下来。
答案 0 :(得分:0)
从此代码段很难得出此方法调用的整个上下文(进行... SendAsync调用的那个),因此可能是Task从未等待异步操作完成,我建议您停顿WhenAll()任务完成或只是ConfigureAwait(true)并观察行为,然后