我当前遇到问题,某物是阻止我的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转换为异步。
还请检查当您调用此"功能"时,您正在使用异步/等待那边。如果您有重音器,那么在这种情况下,当您缺少异步/等待时,这通常会告诉您,因为没有此情况,您可以同步调用您的方法。