先描述需求:现有一个系统有大量的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;
}
}
}