我正在尝试设计一个以编程方式获取网站更新的浏览器.我试图用async/await方法做这个,但是当我尝试运行程序时,它似乎只是挂在response.Wait();. 不知道为什么或者发生了什么.
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var urls = sourceUrls();
Task<HttpResponseMessage> response = login(urls[0]);
response.Wait();
Console.Write( "Complete" );
}
private List<Site> sourceUrls()
{
var urls = new List<Site>();
urls.Add(new Site("http://yahoo.com", "test", "test"));
return urls;
}
}
Run Code Online (Sandbox Code Playgroud)
浏览器类::
static public class Browser
{
private static CookieContainer cc = new CookieContainer();
private static HttpClientHandler handler = new HttpClientHandler();
public static HttpClient browser = new HttpClient(handler);
static Browser()
{
handler.CookieContainer = cc;
}
static public async Task<HttpResponseMessage> login(Site site)
{
var _postData = new Dictionary<string, string>
{
{"test", "test"}
};
FormUrlEncodedContent postData = new FormUrlEncodedContent(_postData);
HttpResponseMessage response = await browser.PostAsync(site.url, postData);
return response;
}
}
Run Code Online (Sandbox Code Playgroud)
另外,对于我的预期目的,是否可以使浏览器成为静态函数,或者这是否有意义?对不起,问题是新的c#
Wait在 UI 线程中调用a不是一个好主意Task,它会导致死锁。您只需简单的await响应即可实现您想要的效果。解开await来自 的响应,Task因此您的返回类型现在只是HttpResponseMessage。因为您无法标记构造函数,因为async您可以将功能移动到启动操作的另一个方法。
public MainWindow()
{
InitializeComponent();
LoadUrlsAsync();
}
public async Task LoadUrlsAsync()
{
var urls = sourceUrls();
HttpResponseMessage response = await login(urls[0]);
Console.Write( "Complete" );
}
Run Code Online (Sandbox Code Playgroud)
请参阅本文以了解使用时的最佳实践async/await。
或者,您可以使用Task.ConfigureAwait扩展方法将延续配置为不在当前运行SyncrhronizationContext,这也应该避免死锁。
public MainWindow()
{
InitializeComponent();
var urls = sourceUrls();
Task<HttpResponseMessage> response = login(urls[0]).ConfigureAwait(false);
response.Wait();
Console.Write( "Complete" );
}
Run Code Online (Sandbox Code Playgroud)