解决方案 »

  1.   

    为了排查问题
    建议先不要多线程,把写入数据入队列
    由单独线程从队列中取数操作入库
    这样可以检测出业务逻辑有没有bug
      

  2.   

    放出你线程的代码来,是否都执行的同一个函数并且没有参数,所以其实都是运行的同一个逻辑?
    简单的检测方法:
    先把另外两个线程注释掉,不让它执行,只执行其中一个线程,看结果
    执行方法放到一个类中的,每个线程都会创建一个该类的对象,运行的逻辑一样,只是有些变量不一样            TaskRun theRun = new TaskRun(RunType.DiffSourceCheck, htPara);
                theRun.SourceNodeDBInfo = SourceNode[0];
                theRun.TargetNodeDBInfo = theDataSource;            listNode.Add(theDataSource.DataSourceNodeCode + "," + theDataSource.DataSourceName);            theRun.CheckDataSource = CheckDataSource;
                theRun.ThreadID = Guid.NewGuid().ToString();
                theRun.ListTaskItem = (from a in theCurTaskInfo.TaskItemList where a.IsSelect select a).ToList<TaskItemInfo>();
                theRun.RunnerSuccess += new RunnerEvent(TaskRunnerSuccessEvent);
                theRun.RunnerFailure += new RunnerEvent(TaskRunnerFailureEvent);
                theRun.SysParameter = SysParameter;
                System.Threading.Thread theThread = new System.Threading.Thread(new System.Threading.ThreadStart(theRun.RunTask));
                theThread.Name = theRun.ThreadID;            ListAllThread.Add(theThread);上面的theDataSource是不一样的
      

  3.   

    不法  -->  无法随便举两个例子。比如说有人定一个private static DbConnection conn;变量,这一看就知道经不起多线程程序考验。再比如说代码foreach( var x in list)
    {
        启动线程处理(x);
    }
    这显然也会出现问题的,因为变量 i 是被多线程所共享访问的。