日期:2014-05-20  浏览次数:20793 次

C#通过循环来创建线程的几点疑问
通过循环创建的线程发生了异常,不知如何解释,我的代码是这样的:
创建的线程类:
C# code

class ProcessFile
    {
         //省略部分代码
 public void FileProcessThread()
        {

            //.........省略部分代码
            //访问文件夹,获取文件列表并进行文件处理
            for (int i = 0; i < folderinfoTable.Rows.Count;i++ )
            {
                 Thread proProcess = new Thread(new ParameterizedThreadStart(mcdprofileProcess));
                    proProcess.Start(folderinfoTable.Rows[i]);

             }
         }
  void mcdprofileProcess(object objdr)
        {
            VersionManage versionmanage = new VersionManage(localdbconnstr);
            //........
            bool ismatch=versionmanage.CheckVersionmatch(mcdlocalfilelistforversion[0].FullName, mcdVersion);   
         }                     
}

线程方法调用的类:
class VersionManage
    {
        //数据库连接
        DBOperation dboperation;

        public VersionManage(string connectionstring)
        {
            dboperation = new DBOperation(connectionstring);
        }

public bool CheckVersionmatch(string filepath,string VersionName)
        {

            //获取该版本类型的数量的sql语句
            string getVernumstr = "SELECT COUNT(*) FROM(SELECT dbo.FILE_VERSION.Version_Name FROM dbo.FILE_VERSION GROUP BY Version_Name) AS temp WHERE temp.Version_Name='" + VersionName + "'";
           [color=#FF0000] object vernumobj = dboperation.ExecuateScalar(getVernumstr);[/color]           //.......................(省略)
         }
}


上面红色部分对象值偶尔会产生null值,如果只有一个线程的时候不会发生。

我是在线程方法里创建的VersionManage实例,也就是每个线程会对应自己的VersionManage对象,所以线程应该是相对独立的,然而发生这种异常的唯一可能就是当一个对象操作完VersionManage实例的CheckVersionmatch方法时,另一个对象操作也操作该实例的该方法(在同一内存处理),方法结束时方法内创建的对象生命周期结束,但是恰好另一个对象也在访问同一个实例的该方法并且刚好处理完红色部分的代码,本来应该有值,但由于被刚才那个释放掉了,所以导致了null值。但这又与我刚开始说的线程相对独立矛盾。麻烦各位高手给个解释

------解决方案--------------------
你要做什么