FileInfo[] files;
private void button1_Click(object sender, System.EventArgs e)
{
if(folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
System.IO.DirectoryInfo di = new DirectoryInfo(folderBrowserDialog1.SelectedPath);
files = di.GetFiles();
ThreadStart ts = new ThreadStart(start);
Thread thread = new Thread(ts);
thread.Start();
}
}
public delegate string myMethodDelegate( object[] args);
static int t = 0;
void start()
{
foreach(FileInfo file in files)
{
System.IO.StreamReader sr = new StreamReader(file.FullName,System.Text.Encoding.Default);
string txt = sr.ReadToEnd();
sr.Close();
myMethodDelegate ddd= new myMethodDelegate(Work2);
ddd.BeginInvoke(new object[]
{txt_connectString.Text,txt,file.FullName},new AsyncCallback(EndWorkBack), null);
Write(string.Format("T:{0}|{1} {1}\r\n",DateTime.Now,file.FullName,t));
//_Task.StartTask(new TaskDelegate(_Task.Work2),new object[]{txt_connectString.Text,txt});
}
}
public string Work2( object[] args)
{
using(SqlConnection conn = new SqlConnection(args[0].ToString()))
{
using(SqlCommand comm = new SqlCommand(args[1].ToString(),conn))
{
comm.CommandTimeout = 60000;
conn.Open();
comm.ExecuteNonQuery();
}
conn.Close();
}
return args[2].ToString();
}
int i =0;
protected void EndWorkBack( IAsyncResult ar ) 
{
myMethodDelegate ddd = (myMethodDelegate)ar.AsyncState;
string result = ddd.EndInvoke( ar );
i++;
Write(string.Format("T:{3}:{2}:{0} {1}\r\n",result,DateTime.Now,i,t));
}
public void Write(string msg)
{
System.IO.StreamWriter sw = new StreamWriter("C:\\install.log",true,System.Text.Encoding.Default);
sw.WriteLine(msg);
sw.Close();
} 不过上面程序也有一点问题,就是异步线程数据没有好的控制。如果同时执行线程,过多,CPU时间片分配就不合理,执行速度反而慢。
后来就一直想用线程池的来合理处理线程。
。Net自带的线程池使用起来比较简单。
通过System.Threading.ThreadTool类就可以使用,
定义回调方法
WaitCallback async = new WaitCallback(FExeute);
通过ThreadPool.QueueUserWorkItem(async,service);加入队列
回调方法执行运算
public void FExeute(object Param)
{
//myResetEvent.WaitOne();
using(TG_EvaluteBaseDatasSet service = (TG_EvaluteBaseDatasSet)Param)
{
service.doResult();
writeFile(Path,service) ;
OnTgReport(new ReportEvent(service.TE_PASS_RANGE,service.TE_YEAR,service.TE_MONTH,int.Parse(service.TE_I_E_FLAG),int.Parse(service.TE_ENTRY_TYPE)));
}
Interlocked.Decrement(ref number);
//number--;
} 其中Interlocked.Decrement,是调用原子操作,进行减操作,
Interlocked.Increment(ref number);是调用原子操作,进行加
原子操作在多线程中不会有冲突。
线程池有几点好处,
1。多线程执行,
2。根据CPU个数,性能等,合理安排执行的线程,(在实际操作过程中,通过SQL SERVER企业管理器中查看当前活动的进程数,可以看到当前正在执行的线程数)
3。异步操作。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/12639172/viewspace-349323/ ,如需转载,请注明出处,否则将追究法律责任。