我有一个winform应用程序,该应用程序发出API请求并将响应写入文本框。这些请求可能需要几分钟才能完成,并防止应用程序因我正在使用后台线程的每个API请求而冻结。但是,我想使用后台工作程序来避免每个表单控件所需的大量委托。如何更改代码以使用后台工作程序代替?
我环顾四周,我发现有关后台工作人员的大多数信息都与进度条有关,我无法弄清如何使用后台工作人员进行工作。
private delegate void TextBox1WriteDelegate(string i);
private void TextBox1Write(string i)
{
textBox1.Text = i;
}
public void GetApiData()
{
using (HttpClient httpClient = new HttpClient())
{
var response = httpClient.GetAsync("http://apiendpoint.com").Result;
textBox1.Invoke(new TextBox1WriteDelegate(TextBox1Write), response.RequestMessage.ToString());
}
}
private void button1_Click(object sender, EventArgs e)
{
Thread t = new Thread(GetApiData);
t.IsBackground = true;
t.Start();
}
答案 0 :(得分:0)
做背景工作人员很容易。
private void button2_Click(object sender, EventArgs e)
{
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (a, b) => GetApiData();
}
但是,这不一定能解决委托问题...
要消除已定义的委托,请将GetApiData()更改为:
public void GetApiData()
{
using (HttpClient httpClient = new HttpClient())
{
var response = httpClient.GetAsync("http://apiendpoint.com").Result;
textBox1.Invoke((Action)delegate
{
textBox1.Text = response.RequestMessage.ToString();
});
}
}
然后可以消除委托定义。
您也可以一路走下去,做到这一点:
private void button3_click(object sender, EventArgs e)
{
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += (a, b) =>
{
using (HttpClient httpClient = new HttpClient())
{
var response = httpClient.GetAsync("http://apiendpoint.com").Result;
textBox1.Invoke((Action)delegate
{
textBox1.Text = response.RequestMessage.ToString();
});
}
};
}
取消所有功能。取决于您是否要在其他地方重用GetAPI数据