C# 多线程问题,使用for循环产生多个线程执行相同的操作

问题描述

如下面的代码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,是否这从而有可能出问题
解决方案十三:
产生异常并退出了,那么多线程写同一文件,当然会产生写的异常,可以捕获异常并输出下,你就可以看到了
解决方案十四:
确实是回收了,在函数外部声明线程

时间: 2024-11-10 01:20:12

C# 多线程问题,使用for循环产生多个线程执行相同的操作的相关文章

Java多线程:“基础篇”09之interrupt()和线程终止方式

1. interrupt()说明 在介绍终止线程的方式之前,有必要先对interrupt()进行了解. 关于interrupt(),java的djk文档描述如下: http://docs.oracle.com/javase/7/docs/api/ Interrupts this thread. Unless the current thread is interrupting itself, which is always permitted, the checkAccess method of

多线程间,变量可见性问题。一个线程会永远看不到另一个线程的更新吗?

问题描述 多线程间,变量可见性问题.一个线程会永远看不到另一个线程的更新吗? 作者说,由于读线程可能永远发现不了main对ready变量的修改就会永远循环下去,但是貌似不太可能永远读不到main对ready变量修改之后的值吧,可能会由于从栈区复制回堆区时,有几毫秒的误差,read线程读到的是旧值,但堆区值更新之后,read线程就读到了新值了吧,为什么说会永远循环下去呢? 解决方案 再回去又读了一遍,有如下解释: 根据JVM设置,如果设置成server模式会有指令重排,如上述循环判断就会变成if(

Java多线程--让主线程等待所有子线程执行完毕在执行_java

朋友让我帮忙写个程序从文本文档中导入数据到oracle数据库中,技术上没有什么难度,文档的格式都是固定的只要对应数据库中的字段解析就行了,关键在于性能. 数据量很大百万条记录,因此考虑到要用多线程并发执行,在写的过程中又遇到问题,我想统计所有子进程执行完毕总共的耗时,在第一个子进程创建前记录当前时间用System.currentTimeMillis()在最后一个子进程结束后记录当前时间,两次一减得到的时间差即为总共的用时,代码如下  long tStart = System.currentTim

foreach循环遍历数组搞不懂执行顺序思路

问题描述 foreach循环遍历数组搞不懂执行顺序思路 搞不懂if判断那一块 最好有大神能给详细说明一下执行顺序 解决方案 这也没那么复杂http://blog.csdn.net/china_skag/article/details/6444727

java-for循环中有多个if判断,for循环16次,优先执行一个if判断

问题描述 for循环中有多个if判断,for循环16次,优先执行一个if判断 Java for循环中有3个if判断依次执行.for循环16次, 我想让第一个if判断先执行16次(优先执行16次), 如果在16次中有符合第一个if判断的就执行停止循环. 如果16次之后,第一个if判断没有符合的结果,在依次执行第2和第3个if判断. 优先执行第一个if判断如何做,请大神赐教. 解决方案 #!/bin/bash for((i=1;i do ? ? if((i%3==0)) ? ? ? ? then ?

JAVA之旅(十四)——静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制

JAVA之旅(十四)--静态同步函数的锁是class对象,多线程的单例设计模式,死锁,线程中的通讯以及通讯所带来的安全隐患,等待唤醒机制 JAVA之旅,一路有你,加油! 一.静态同步函数的锁是class对象 我们在上节验证了同步函数的锁是this,但是对于静态同步函数,你又知道多少呢? 我们做一个这样的小实验,我们给show方法加上static关键字去修饰 private static synchronized void show() { if (tick > 0) { try { Thread

《Java多线程编程核心技术》——1.7节停止线程

1.7 停止线程停止线程是在多线程开发时很重要的技术点,掌握此技术可以对线程的停止进行有效的处理.停止线程在Java语言中并不像break语句那样干脆,需要一些技巧性的处理.使用Java内置支持多线程的类设计多线程应用是很常见的事情,然而,多线程给开发人员带来了一些新的挑战,如果处理不好就会导致超出预期的行为并且难以定位错误.本节将讨论如何更好地停止一个线程.停止一个线程意味着在线程处理完任务之前停掉正在做的操作,也就是放弃当前的操作.虽然这看起来非常简单,但是必须做好防范措施,以便达到预期的效

Java多线程同步问题的探究(一、线程的先来后到)

众所周知,在Java多线程编程中,一个非常重要的方面就是线程的同步问题. 关于线程的同步,一般有以下解决方法: 1. 在需要同步的方法的方法签名中加入synchronized关键字. 2. 使用synchronized块对需要进行同步的代码段进行同步. 3. 使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象. 另外,为了解决多个线程对同一变量进行访问时可能发生的安全性问题,我们不仅可以采用同步机制,更可以通过JDK 1.2中加入的 ThreadLocal

Android多线程研究(7)Java5中的线程并发库

从这一篇开始我们将看看Java 5之后给我们添加的新的对线程操作的API,首先看看api文档: java.util.concurrent包含许多线程安全.测试良好.高性能的并发构建块,我们先看看atomic包下的AtomicInteger. import java.util.concurrent.atomic.AtomicInteger; public class AtomicIntegerTest { private static AtomicInteger data = new Atomic