异步httpclient操作

cub*_*nyc 5 c# asynchronous

我正在尝试设计一个以编程方式获取网站更新的浏览器.我试图用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#

Ned*_*nov 1

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)