比方说网络打印机 有5台 192.168.0.10 - 192.168.0.15
有台PC服务器 所有的打印请求都会放在数据库里3张表里(不同的表 打印的格式不一样) 
现在要求就是做个打印服务器  循环采用多线程 向不同的打印机输出打印内容 打印成功后回填打印成功标志数据库大概是这样的表A 
打印内容  打印机IP 打印时间表B 
打印标题 打印内容 打印机IP 打印时间表C打印人  打印内容 打印机IP 打印时间=====================================================
以前早期的做法是单线程 循环表A记录 然后根据打印机IP输出内容 然后循环表B ... 表C 但是问题在于如果有台打印机异常 后面的任务就会一直等待
-------------------------------
现在需要改写这个程序  打算一台打印机就输出一条线程 这样互不干扰
我现在考虑的问题是 
1. 对打印机先做循环 取出一共有多少台打印机 然后开启多少条线程 再去数据库里取相应的打印记录 对表A B C进行循环还是2. 先取出所有数据然后 看取出数据里有多少打印机 在开启相应的线程
比如 
表A 有 3条记录 192.168.0.11 2条记录 192.168.0.15 1条记录
表B 有 5条记录 192.168.0.11 1条记录 192.168.0.10 3条记录 192.168.0.15 1条记录
表C 有10条记录 192.168.0.12 3条记录 192.168.0.13 5条记录 192.168.0.14 2条记录
感觉思维有点混乱 又是多线程 又是多表的  有没人做过类似的 帮忙梳理梳理思路

解决方案 »

  1.   

    只按照表走就行,多线程只是解决方法。可以在程序里用timer控制。
      

  2.   


           List<PosPrinter> poss = new List<PosPrinter>();  //主任务 创建个打印机集合            foreach (DataRow item in ds.Tables[0].Rows) //读取记录
                {
                    PosPrinter pos = new PosPrinter() { ip = item["printIP"].ToString() };
                    if (!poss.Contains(pos)) //如果打印机集合里没有这台打印机 就添加
                    {
                        poss.Add(pos); 
                    }                //这里添加需要打印的内容 赋给打印机
                    pos.Works.Add(item["title"].ToString()); //这里好像感觉也有问题                
                }
                //然后对打印机做循环
                foreach (PosPrinter pos in poss)
                {
                    //这里的线程 我总担心前一次的还没做完 又执行到这里又new 一个线程 
                    Thread worker = new Thread(new ThreadStart(pos.PrintWork));
                    worker.Start();
                }
    PosPrinter  类代码
        public class PosPrinter :IEquatable<PosPrinter>
        {
            public string ip { get; set; } 
            public List<string> Works = new List<string>(); //工作集合
            BeiYangOPOS opos = new BeiYangOPOS(); 
            public void PrintWork() {
                 //执行打印任务
           }    
    }