先描述需求:现有一个系统有大量的log日志,以文本形式存储。现在需要对这些日志进行分析和处理。由于文件较多,希望能用多线程的方式并发的分析处理这些文件。
下面是本人做的一个效果图
datagridview绑定了一个本地的datatabe,这样可以直接对datatable进行操作,就能更新界面显示的数据了。
首先将指定目录下的全部log文件路径添加到datatable中。
创建3个线程,依次处理状态为新增的文件,将状态改为处理中,并显示是哪个线程处理的。
处理完成后,会在最后一列显示已处理的记录数,并继续寻找下一条未处理的文件。
本人的代码已传到csdn的下载频道
代码参考了雲霏霏的5天玩转C#并行和多线程编程系列
下面是本人做的一个效果图
datagridview绑定了一个本地的datatabe,这样可以直接对datatable进行操作,就能更新界面显示的数据了。
首先将指定目录下的全部log文件路径添加到datatable中。
创建3个线程,依次处理状态为新增的文件,将状态改为处理中,并显示是哪个线程处理的。
处理完成后,会在最后一列显示已处理的记录数,并继续寻找下一条未处理的文件。
本人的代码已传到csdn的下载频道
代码参考了雲霏霏的5天玩转C#并行和多线程编程系列
解决方案
100
本人对 多线程 和 DataTable 都不熟悉
看了你们的讨论也学着做了一个,应该是能满足你的要求的。你可参考一下
看了你们的讨论也学着做了一个,应该是能满足你的要求的。你可参考一下
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; using System.Threading; namespace 多道 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } DataTable dt = new DataTable(); protected override void OnLoad(EventArgs e) { dt.Columns.Add("ID", System.Type.GetType("System.Int32")); dt.Columns.Add("文件名", System.Type.GetType("System.String")); dt.Columns.Add("路径", System.Type.GetType("System.String")); dt.Columns.Add("线程", System.Type.GetType("System.String")); dt.Columns.Add("状态", System.Type.GetType("System.String")); dataGridView1.DataSource = dt; dataGridView1.Columns[0].Width = 40; dataGridView1.Columns[1].Width = 200; dataGridView1.Columns[2].Width = 140; dataGridView1.Columns[3].Width = 60; dataGridView1.Columns[4].Width = 100; int n = 1; foreach (var f in Directory.GetFiles("d:\amp\web\", "*.txt")) { var tr = dt.NewRow(); tr["ID"] = (n++).ToString(); tr["文件名"] = Path.GetFileName(f); dt.Rows.Add(tr); } } private void button1_Click(object sender, EventArgs e) { //用一个线程去完成处理,不然主界面就假死了 var th = new Thread(main); th.Start(); } void main() { var q = from x in dt.AsEnumerable().AsParallel().WithDegreeOfParallelism(50) //允许并发50个任务 select DoIt(x.Field<string>("文件名"), dt); MessageBox.Show(string.Format("总共用了{0}个线程执行了{1}个任务!", q.Distinct().Count(), dt.Rows.Count)); } static int DoIt(string task, DataTable dt) { var tid = Thread.CurrentThread.ManagedThreadId; lock (dt) { var tr = dt.Select(string.Format("文件名="{0}"", task))[0]; tr["线程"] = tid.ToString(); tr["状态"] = "开始"; } Thread.Sleep(1000); //模拟耗时操作 lock (dt) { var tr = dt.Select(string.Format("文件名="{0}"", task))[0]; tr["状态"] = "完成"; } return tid; } } }