gpt4 book ai didi

c# - 异步 httpclient 操作

转载 作者:太空狗 更新时间:2023-10-29 23:38:51 26 4
gpt4 key购买 nike

我正在尝试设计一个能够以编程方式获取站点更新的浏览器。我正在尝试使用异步/等待方法来执行此操作,但是当我尝试运行该程序时,它似乎只是卡在 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;
}
}

浏览器类::

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;
}
}

此外,为了我的预期目的,是否可以将浏览器设置为静态函数,还是没有意义?抱歉问题,c# 新手

最佳答案

在 UI 线程中的 Task 上调用 Wait 是个坏主意,它会导致死锁。您可以简单地 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" );
}

参见 this有关使用 async/await 的最佳实践的文章。

或者,您可以使用 Task.ConfigureAwait 扩展方法将延续配置为不在当前 SyncrhronizationContext 上运行,这也应该可以避免死锁。

public MainWindow()
{
InitializeComponent();

var urls = sourceUrls();
Task<HttpResponseMessage> response = login(urls[0]).ConfigureAwait(false);
response.Wait();

Console.Write( "Complete" );
}

关于c# - 异步 httpclient 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23706052/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com