小白有个问题,winform异步更新ui,用thread可以处理,但是这样的话我按钮每点一次就会创建一个线程。我想实现的是点一下按钮后有个线程来处理这个事件,处理完后线程就直接回收。后来想用线程池来处理,但是写了线程池,代码就不执行了,大佬帮忙看看
//选择结果文件导入
private void button7_Click(object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(input),10);
Thread.Sleep(500);
}
private void input(object obj)
{
try
{
OpenFileDialog fileDialog = new OpenFileDialog();
fileDialog.Multiselect = true;
fileDialog.Title = "请选择结果文件XML";
fileDialog.Filter = "所有文件(*.xml*)|*.xml*";
if (fileDialog.ShowDialog() == DialogResult.OK)
{
progressBar1.Value = 0;
string[] names = fileDialog.FileNames;
XHYUN rm = new XHYUN();
foreach (string file in names)
{
richTextBox2.AppendText("文件:" + file.ToString() + "{\n");
string msg;
bi = rm.GetInfo(file.ToString());
msg = rm.import(bi);
// richTextBox2.AppendText(msg);
richTextBox2.AppendText("}\n");
log.CheckLog(DateTime.Now + " ->" + "上传结果至平台完成:" + "\r\n" + msg + "\r\n");
}
thread.IsBackground = true;
thread.Start();
threadList.Add(thread);
}
}
catch (Exception exp)
{
MessageBox.Show("导入失败,报错信息为:" + exp.ToString());
log.CheckLog(DateTime.Now + " ->" + "上传结果至平台失败:" + "\r\n" + exp.ToString() + "\r\n");
}
}
我就想实现点击按钮后程序不要假死,又不要创建过多的线程
自己解决了,,,,ui线程用委托,
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;//使线程可以调用窗体控件
form1 = this;
ThreadPool.SetMaxThreads(3, 3);
}
线程池是这么设置的