gpt4 book ai didi

c# - 如何从异步方法中获取 button_ClickEvent 中的字符串

转载 作者:行者123 更新时间:2023-11-30 20:53:35 25 4
gpt4 key购买 nike

伙计们,我有以下代码:

public static CookieContainer cookies;
public static HttpWebRequest GetNewRequest(string targetUrl, CookieContainer SessionCookieContainer)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(targetUrl);
request.CookieContainer = SessionCookieContainer;
request.AllowAutoRedirect = false;
return request;
}
public async static Task<HttpWebResponse> MakeRequest(HttpWebRequest request, CookieContainer SessionCookieContainer, Dictionary<string, string> parameters = null)
{
HttpWebResponse response;
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.52 Safari/536.5Accept: */*";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
request.CookieContainer = SessionCookieContainer;
request.AllowAutoRedirect = false;
if (parameters != null)
{
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
string s = "";
foreach (KeyValuePair<string, string> pair in parameters)
{
if (s.Length == 0)
{
s = s + string.Format("{0}={1}", pair.Key, pair.Value);
}
else
{
s = s + string.Format("&{0}={1}", pair.Key, pair.Value);
}
}
byte[] bytes = Encoding.UTF8.GetBytes(s);
using (Stream stream = await request.GetRequestStreamAsync())
{
stream.Write(bytes, 0, bytes.Length);
}
}
request.Method = "GET";
response = await request.GetResponseAsync() as HttpWebResponse;
SessionCookieContainer.Add(response.Cookies);
while (response.StatusCode == HttpStatusCode.Found)
{
response.Close();
request = GetNewRequest(response.Headers["Location"], SessionCookieContainer);
response = await request.GetResponseAsync() as HttpWebResponse;
SessionCookieContainer.Add(response.Cookies);
}
return response;
}

我使用这个函数的一些方法(例如)

async Task<string> login(string url, string id, string pw)
{
///code...
}

我的问题是:如果我想在 buttonclick(object sender, EventArgs e) 中得到结果我该怎么办?

我已经试过了,但是没有用:

private void buttonclick(object sender, EventArgs e)
{
string htmlPage=login(url, id, pw);
}

编辑

我已经解决了添加 async 的问题在 private 之间无效并添加await之前login(bla bla)

最佳答案

虽然以下是一个显而易见的解决方案,但它有隐藏的问题:

private async void buttonclick(object sender, EventArgs e)
{
string htmlPage = await login(url, id, pw);
}
  • 如果 login 抛出异常怎么办?它不会被观察到,很可能会使应用程序崩溃。
  • 如果用户点击一个按钮两次,而之前的异步登录操作已经在进行中怎么办?您当然不希望有两个待处理的登录。

这是一个稍微改进的版本:

Task<string> _pendingLogin = null;
private async void buttonclick(object sender, EventArgs e)
{
if (_pendingLogin != null)
{
MessageBox.Show("Login pending...");
return;
}

try
{
_pendingLogin = login(url, id, pw);
string htmlPage = await _pendingLogin;
MessageBox.Show("Logged in: " + htmlPage);
}
catch(Exception ex)
{
MessageBox.Show("Error in login: " + ex.Message);
}

_pendingLogin = null;
}

关于c# - 如何从异步方法中获取 button_ClickEvent 中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19848182/

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