本人是搞web开发的,对于线程方面研究很少,只是知道基本的概念。在web中,异步都是用ajax来实现。最近做了个小项目是用来拆分word文档的。项目完成后,要处理几十万条的数据。这个时候再用web来实现就很不友好了。说以就想到了用winform来实现。下面来列出需求:
- 有个输入框,输入sql语句。
- 有个主键的起始,截止输入框。
- 开始处理的按钮。中止的按钮等。显示处理的进度条(由于处理数据较大,进度条半天也没走到,这个时候为了直观就需要使用lable来计数处理的条数)
为了不影响窗体的运行。开始的处理需要在新的线程中运行,在处理的过程中,每处理一条数据需要对lable标签赋值(跨线程访问控件)

以下是程序代码:
namespace DateManager
{
public partial class Form1 : Form
{
Thread td = null;
public Form1()
{
InitializeComponent();
td = new Thread(begionSplit);
}
private void button1_Click(object sender, EventArgs e)
{
td.IsBackground = true;
td.Start();
}
public void begionSplit()
{
string sql = this.tb_Sql.Text;
int begionindex = Convert.ToInt32(this.tb_pagesiez.Text == "" ? "10" : this.tb_pagesiez.Text);
int endindex = Convert.ToInt32(this.tb_pageIndex.Text == "" ? "1" : this.tb_pageIndex.Text);
sql = sql + " and CATInID >=" + begionindex + " and CATInID <=" + endindex + "";
SplitLowSystem.BLL.SourceLawBLL bll = new SplitLowSystem.BLL.SourceLawBLL();
int pagecout = 0;
DataTable dt = SplitLowSystem.Common.DbHelperSQL.Query(sql).Tables[0];
if (progressBar1.InvokeRequired)
{
this.progressBar1.Invoke(new MethodInvoker(() => { progressBar1.Maximum = dt.Rows.Count; }));
}
else
{
progressBar1.Maximum = dt.Rows.Count;
}
for (int i = 0; i < dt.Rows.Count; i++)
{
try
{
if (progressBar1.InvokeRequired)
{
this.progressBar1.BeginInvoke(new MethodInvoker(() => { progressBar1.Value = i + 1; }));
}
else
{
progressBar1.Value = i + 1;
}
if (lb_int.InvokeRequired)
{
this.lb_int.BeginInvoke(new MethodInvoker(() => { this.lb_int.Text = (i + 1).ToString(); }));
}
else
{
this.lb_int.Text = (i + 1).ToString();
}
string CATInID = dt.Rows[i]["CATInID"].ToString();
string sqlstr = "select * from LawProv where CATInID=" + CATInID + " order by ProvNumber ";
DataSet dss = SplitLowSystem.Common.DbHelperSQL.Query(sqlstr);
bll.SplitByds(dss, CATInID);
}
catch
{
continue;
}
}
MessageBox.Show("处理完毕!");
td.Abort();
}
}
}