C#线程UI被阻止|WebRequest.greate的可能原因



我当前遇到问题,某物是阻止我的UI线程。我知道这是在以下功能中发生的:

public async Task<string> function(string username, string password, string handle)
{
    try
    {
        string finalStr;
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://url.com");
        request.CookieContainer = cookie;
        request.AllowAutoRedirect = true;
        var response = await request.GetResponseAsync();
        string str = new StreamReader(response.GetResponseStream(), Encoding.UTF8).ReadToEnd();
        string str2 = this.getToken(str, "_token" value="", "">", 0);
        string[] textArray1 = new string[] { "postVariables=" + str2 };
        HttpWebRequest httpWebRequest_0 = (HttpWebRequest)WebRequest.Create("https://url.com");
        httpWebRequest_0.CookieContainer = cookie;
        httpWebRequest_0.Method = "POST";
        httpWebRequest_0.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
        httpWebRequest_0.Referer = "https://twitter.com/settings/account";
        httpWebRequest_0.UserAgent = "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2";
        httpWebRequest_0.AllowAutoRedirect = true;
        httpWebRequest_0.ContentType = "application/x-www-form-urlencoded";
        byte[] bytes = Encoding.ASCII.GetBytes(string.Concat(textArray1));
        httpWebRequest_0.ContentLength = bytes.Length;
        Stream requestStream = await httpWebRequest_0.GetRequestStreamAsync();
        await requestStream.WriteAsync(bytes, 0, bytes.Length);
        var response2 = await httpWebRequest_0.GetResponseAsync();
        using (StreamReader reader = new StreamReader(response2.GetResponseStream()))
        {
            finalStr = reader.ReadToEnd();
        }
        if (finalStr.Contains(handle))
        {
            return "success";
        }
        else
        {
            requestStream.Close();
            return "error";
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

我相信这是功能的这一部分:

HttpWebRequest httpWebRequest_0 = (HttpWebRequest)WebRequest.Create("https://url.com");

如何创建async WebRequest.create?还有其他我做错了吗?

我感谢任何帮助和建议。

以来那时。

一个简单的解决方法可以创建一个任务并尊重它

HttpWebRequest request = await Task.Run(()=> WebRequest.Create("https://google.com") as HttpWebRequest);

我建议将httpclient切换为推荐客户端向前迈进。(感谢提醒ERIK)

这将需要一些更新以满足您的需求,但这是进行过渡的起点。

            using (var client = new HttpClient(new HttpClientHandler
            {
                AllowAutoRedirect = true,
                CookieContainer = new CookieContainer()
            }))
            {
                client.DefaultRequestHeaders.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"));
                client.DefaultRequestHeaders.Referrer = new Uri("https://twitter.com/settings/account");
                client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2");
                // Get
                var result = await client.GetAsync(new Uri(""));
                if (result.IsSuccessStatusCode)
                {
                    var content = await result.Content.ReadAsStringAsync();
                }
                else
                {
                    Console.WriteLine($"{result.StatusCode}: {await result.Content.ReadAsStringAsync()}");
                }
                // Post
                var post = await client.PostAsync("Uri", new StringContent("could be serialized json or you can explore other content options"));
                if (post.IsSuccessStatusCode)
                {
                    var contentStream = await post.Content.ReadAsStreamAsync();
                    var contentString = await post.Content.ReadAsStringAsync();
                }
            }

您可以使用

将任何代码转换为异步代码
Task.Run(()=>{
  //any code here...
});

,但我认为,只要您的输入方法是异步的,那么在异步下运行的所有内容都参考了调用该方法的代码。

public async Task<string> function(string username, string password, string handle)
因此,

应该在不阻止您的UI CUZ的情况下运行您,您不会期望将Everthing转换为异步。

还请检查当您调用此"功能"时,您正在使用异步/等待那边。如果您有重音器,那么在这种情况下,当您缺少异步/等待时,这通常会告诉您,因为没有此情况,您可以同步调用您的方法。

最新更新