【发布时间】:2017-08-14 11:35:04
【问题描述】:
我有以下代码:
public class HttpRequestsHandler
{
public static T HttpGetWithContent<T>(string requestUrl)
{
using (var handler = new WebRequestHandler())
{
handler.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;
using (var httpClient = new HttpClient(handler)
{
BaseAddress = new Uri(requestUrl),
Timeout = Timeout.InfiniteTimeSpan
})
{
using (var response = httpClient.GetAsync(requestUrl).Result)
{
if (response.StatusCode != HttpStatusCode.OK && response.StatusCode != HttpStatusCode.Gone)
{
var errorMessage = $"HttpRequestTask: Request failed with status {response.StatusCode} for URL: {requestUrl}";
throw new HttpException(errorMessage, (int)response.StatusCode);
}
return response.Content.ReadAsAsync<T>().Result;
}
}
}
}
public static T HttpGetWithContentWrapper<T>(string requestUrl)
{
return HttpGetWithContent<T>(requestUrl);
}
}
现在当我调用它时:
private void Button_Click(object sender, DoWorkEventArgs e)
{
var worker = new BackgroundWorker();
worker.DoWork += (sender, args) =>
{
var url = UrlProvider.BuildRequestUrl();
var date = HttpRequestsHandler.HttpGetWithContent<DateTime>(url);
//More code...
};
worker.RunWorkerCompleted += (sender, args) =>
{
//more code...
};
worker.RunWorkerAsync();
}
它就像一个魅力,但是当我使用包装方法时:
private void Button_Click(object sender, DoWorkEventArgs e)
{
var worker = new BackgroundWorker();
worker.DoWork += (sender, args) =>
{
var url = UrlProvider.BuildRequestUrl();
var date = HttpRequestsHandler.HttpGetWithContentWrapper<DateTime>(url); //fails here
//More code...
};
worker.RunWorkerCompleted += (sender, args) =>
{
//more code...
};
worker.RunWorkerAsync();
}
它以错误“不可访问区域”结束。
现在我想这与我不熟悉的一次性模式有关。据我了解,它用于应用程序中的非托管资源,因此对象仅存在于“使用”中。
我不明白的是它如何在第一部分返回一个值,但在第二部分却不行......
谢谢,
更新 - 抱歉,为了让它正常工作,我对代码进行了这么多操作,我粘贴了错误的代码,我将其更改为给我带来麻烦的原始代码,谢谢
【问题讨论】:
-
return HttpGetWithContent<T>(string requestUrl);行看起来不对。你确定不应该是return HttpGetWithContent<T>(requestUrl); -
只是为了确保 - 两个测试中的 url 完全相同?
-
是否使用 "return HttpGetWithContent
(string requestUrl);" 进行编译 - 我得到 "Invalid expression term 'string'"如果我复制你的代码,“语法错误,',' 预期”。 -
您在 Winforms 应用程序中的任务上使用了
.Result,这几乎肯定会死锁。如果你想使用异步代码,你必须一直使用异步代码。