求帮忙写一个多进程的程序

.Net技术 码拜 9年前 (2016-02-27) 1068次浏览
先描述需求:现有一个系统有大量的log日志,以文本形式存储。现在需要对这些日志进行分析和处理。由于文件较多,希望能用多线程的方式并发的分析处理这些文件。
下面是本人做的一个效果图
求帮忙写一个多进程的程序
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;
        }
    }
}

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求帮忙写一个多进程的程序
喜欢 (0)
[1034331897@qq.com]
分享 (0)