多线程老是出现这样的错误,实在不行了,求救!
        private void Do()     //这个函数作为副线程的入口
        {
            //调用ImportToDB(DataSet ds);
        }        private void ImportToDB(DataSet ds)
        {
            //调用ExcelToDataSet(string filePath, string sheet);
        }
        
        private DataSet ExcelToDataSet(string filePath, string sheet)
        {
        }
现在的情况是,始终有异常:“以前的函数求值超时,函数求值被禁用。必须继续执行才能重新启用函数求值”,网上查了一下,有网友说刷新异常窗口左侧的刷新按钮,但是异常还是一直发生。
崩溃了。不知道我说清楚了没有,有问题的话,我再说。天呐!

解决方案 »

  1.   


    单线程当然没有问题了,问题在于多线程的数据共享上。如果多个线程同时访问一个dataset,可能会造成访问失败,不如用锁试一下,在多线程同时访问一块数据区域时,请加锁。
      

  2.   

    请按照①②③④⑤的方式逐行阅读       private void Do()     //这个函数作为副线程的入口
            {
                //调用ImportToDB(DataSet ds);
            }        private void ImportToDB(DataSet ds)
            {
                //调用ExcelToDataSet(string filePath, string sheet);
                //每次向缓存里写数据③
                stringbuff.Append();
            }
            
            private static StringBuilder stringbuff;//②设置一个缓存字符串
            private DataSet ExcelToDataSet(string filePath, string sheet)
            {
                //!!! 问题出在这里,我觉得  ①
                  //这里会涉及写文件吧? 仔细想想,文件如果在打开的情况下,其他线程还能写么? 给出以下解决思路  见②
                 //④循环的只让一个线程负责打开文件去把缓存的东西写入文件,这样,同时只打开一个文件,多线程不会出错
                 while(true)
               {
                  //...... 你写文件的方法,内容来自缓存字符串,路径的话,你可以自己把stringBuilder变成一个2围的LIST,具体看你自己的需求
                  sleep(500);//⑤ 500毫秒写1次文件
               }
               
            }
      

  3.   


    我的代码是这样的,多线程在真实调用方法其实是ImportToDB,把数据写到一个缓存区去,多线程同时调用,其实是对缓存进行写
    而写文件的时候,尽量的要避免有多个线程去打开文件的这种情况~ 就算你方法里加了LOCK,依然会有问题,不信你可以写段代码测试一下,
    我也不必烧香了,10个线程基本每次都会报错了~ 这点我很肯定,但是,上面的这段东西其实是要做一个多线程和写文件的分离
    我所说的为什么多线程调用写文件不会出错,那是因为, 多线程在真实调用方法其实是ImportToDB  以上代码把多线程操作和文件单线程操作分开了,在多线程操作时不与文件操作打交道,而与文件打交道的线程,只有一个~
      

  4.   


    不是很明白为什么 lock 为什么没有生效, 例如下面的代码,总是按照以下的顺序输出:Thread 1 start
    Thread 2 start
    Thread 1 sleeping
    Thread 1 awaked
    Thread 2 awaked并且在 ThreadProc1 里面的 Thread.Sleep(5000) 多久, 线程 t2 就等多久
            public static object SyncRoot = new object();        public static void ThreadProc1()
            {
                Console.WriteLine("Thread 1 start");            lock (SyncRoot)
                {
                    Console.WriteLine("Thread 1 sleeping");                // 阻止线程1, 考察 lock 是否生效
                    Thread.Sleep(5000);                Console.WriteLine("Thread 1 awaked");
                }
            }        public static void ThreadProc2()
            {
                Console.WriteLine("Thread 2 start");            // 确保 Thread 1 首先进入睡眠
                Thread.Sleep(30);            lock (SyncRoot)
                {
                    Console.WriteLine("Thread 2 awaked");
                }
            }        static void Main(string[] args)
            {
                Thread t1 = new Thread(new ThreadStart(ThreadProc1));
                Thread t2 = new Thread(new ThreadStart(ThreadProc2));            t1.Start();
                t2.Start();            Console.Read();
            }
    另外建议你用 Thread.CurrentThread.ManagedThreadId 来考察一下是否读写都发生在同一线程中。
      

  5.   

    DataTable之类的东西对多线程的访问是不安全的,需要加锁
      

  6.   

    偏题了貌似.... 这些代码中没有和文件打交道的代码~ 自然不会出错,而且LOCKHELP对象也只有一个.....把Console.WriteLine改成写文件你试试~
      

  7.   


    Thread 1 里面格式化 D 盘, 然后在 Thread 2 里面向 D 盘写东西都可以...lock 的对象当然只有一个, 因为共享的资源就只有一个, 要是每条线程都 lock 不同的东西, 那样有什么意义
      

  8.   

    几天没来,发现大家讨论的很热烈啊!谢谢各位!
    楼上有兄弟说到问题出在多线程的数据共享上,我现在的情况是:主线程里的函数返回一个dataset,然后将这个dataset作为参数传递给副线程里某个函数。这样会存在数据的共享问题而且需要lock吗?