问题描述
如下面的代码publicvoidbtnRead(){for(inti=0;i<10;i++){ThreadthreadReadData=newThread(newParameterizedThreadStart(delegate(objectobj){ReadData(i);}));threadReadData.IsBackground=true;threadReadData.Start(i);}}privatevoidReadData(objectobj){while(true){stringreturnString=DoSomething(obj);FileLogger.WriteLog(obj.toString()+returnString);}}
使用for循环生成10个线程,然后执行操作,往文件中写日志,但运行一会之后有线程消失,日志文件中只有二到三个线程在运行了,请问这个是什么原因?
解决方案
解决方案二:
被gc回收了?
解决方案三:
writelog等函数有没有出异常?
解决方案四:
抛出异常了呗
解决方案五:
捕捉程序错误提示
解决方案六:
没有异常产生,运行一段时间后,线程轮流出现
解决方案七:
你的ReadData中有死循环,所以ReadData一旦执行就不会退出子线程只是在其他线程的空隙中得以运行(比如I/O时)也就是执行到FileLogger.WriteLog(obj.toString()+returnString);时才可能执行其他线程,这还与系统的调度有关
解决方案八:
你很多线程同事操作一个文件,肯定出问题啊。不然人家写log日志,干嘛要用单例模式?!你只所以出现了2-3行,是因为最先进去的前面几个书写文件成功了。但是后面进来的线程想要进去的时候,可能被提示了文件正在被使用之类的信息,导致线程无法打开文件,然后就抛出异常了
解决方案九:
死循环问题,可以用多个时间线程执行
解决方案十:
WriteLog一般是共享读,独占写的,这样就会有并发冲突,导致有些线程打开文件时就出错了,线程退出
解决方案十一:
加一个暂停,阻塞一下循环线程。比如每一个循环停10秒钟,在执行多线程。你看看是不是都写了。然后你再看看文件。把文件每一次写都创建新文件
解决方案十二:
privatevoidDoSomething(obj){try{lock(htRFIDInfo.SyncRoot){if(htRFIDInfo.Contains(portAnt)){htRFIDInfo[portAnt]=rfidItem;}else{htRFIDInfo.Add(portAnt,rfidItem);}}}catch(Exceptionex){MessageBox.Show(ex.Message);}}DoSomething中执行了更新hashtable,是否这从而有可能出问题
解决方案十三:
产生异常并退出了,那么多线程写同一文件,当然会产生写的异常,可以捕获异常并输出下,你就可以看到了
解决方案十四:
确实是回收了,在函数外部声明线程