关于C#多线程的问题

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace WinformTest
{
class Threadtest
{
public static int n = 0;
// public int removenum;//被关闭线程的序号
List<Thread> listThread = new List<Thread>();
Thread thread=null;

//启动线程
public void threadtest()
{
thread=new Thread(new ThreadStart(test));
thread.Name = "Thread"+ n;
listThread.Add(thread);
thread.Start();
// thread.IsBackground = true;
n++;
}

//线程启动函数
private static void test()
{
Form2 form2 = new Form2();
form2.ShowDialog();
}

public void outthread()
{
foreach(Thread tempthread in listThread)
{
Console.WriteLine(tempthread.Name);
}
}

}
}

我在threadtest()中新建线程,但是为什么在其他类中调用outthread()函数不能输出线程的名字?
采用单步调试时,显示foreach语句中根本没有运行,这是为什么?
还有个问题就是:我是通过该线程新建了form2窗体,那为什么执行form.hide()时,线程也同时关闭了?这是为什么?解决问题加分

你是怎么调用用Threadtest的,一般应该是这样

Threadtest t = new Threadtest();
t.threadtest();//启动线程
t.outthread();//此时就会进入foreach,form2此时还未显示出来


至于那个hide的问题,只有当showdialog出来的form2窗体hide或者关闭之后,创建form2的那个线程才能继续向下执行,向下执行的结果当然就是线程结束了。你可以简单的把test改成这样看看

private static void test()
{
    Form2 form2 = new Form2();
    form2.ShowDialog();
    int i = 0;
    while (true) //当你hide掉form2或者关闭之后,这个循环才开始运行
    {
        Console.WriteLine(i++);
        Thread.Sleep(100);
    }
}

追问

按你说的试了,行了。但是为什么hide掉form2才会执行那个while循环?

追答

这个跟ShowDialog有关了,一般的理解是当一个窗体ShowDialog之后,创建这个窗体的那个线程就会进入等待状态,直至这个ShowDialog出来的窗体被关闭或者被隐藏,至于再具体的showdialog内部的消息运作原理没找到,你要自己查一下了。

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-11-26
线程的生命周期已经完了,listThread都是空的,怎么会执行foreach语句呢?
第2个回答  2013-11-26
代码不全 无法解答追问

就一个调用outthread()函数,其他地方都没有用到多线程

多线程保存文件报错c#
请问你是想问“多线程保存文件报错c#是怎么回事”吗?该问题的原因有:文件访问冲突、文件访问冲突。1、文件访问冲突:当多个线程试图同时写入同一个文件时,会出现竞争条件。如果两个线程试图在同一时间写入文件的相同部分,会导致数据损坏或者写入的数据不完整。为了解决这个问题,可以使用文件锁(FileLock...

C#中的多线程超时处理实践
最近处理C#中timeout行为的bug,解决方案涉及多线程超时处理。首先,创建了一个类来处理超时操作。定义了`OperationHandler`类,包含`IOperation`接口实例和`StartWithTimeout`方法,用于在超时后执行操作,以及`StopOperationIfNotStartedYet`方法,用于在超时期间停止操作。接着,实现了一个操作类`MyOperation...

C#多线程问题
1、服务器启动监听端口;2、客户端向服务发出连接请求,同时创建一个随机监听端口,并进行监听;3、服务器接收到连接请求后创建一个连接,进行基本消息验证,验证通过,读取消息协议中客户端的IP和随机端口,向客户端发出连接请求,同时释放服务器端监听创建的连接,以便处理下一个监听;4、客户端与服务器...

C#网络编程与多线程的疑问,求指点
private void btnStart_Click(object sender, EventArgs e) { bg.RunWorkerAsync(); } \/\/线程暂停,如果不需要暂停就不用,这里只是说明用法 private void btnStop_Click(object sender, EventArgs e) { bg.CancelAsync(); } \/\/窗体关闭时,停止线程 protected override...

c# 多线程的小问题
多线程可以有效的并发。对于包含不同任务的程序,可以考虑每个任务使用一个线程。这样的程序在设计上相对于单线程做所有事的程序来说,更为清晰明了,比如生产、消费者问题。在实际的开发中对于性能优化的问题需要考虑到具体的场景来考虑是否使用多线程技术。也就是说线程和效率不是成正比对应的 ...

C#语言,处理多线程时,让线程运行死循环,却有线程在处理数据时,意外退 ...
你的代码肯定有数据的错误,比如int型超过21亿溢出,非数字型字符串强制转换数字型,等等任何数据的错误都会导致线程退出,你把死循环整个try{}catch{}起来,就不会退出了

C#中的多线程问题用于什么地方?怎么掌握?
多线程公用一个对象时,就不应该使用lock关键字了,这里Monitor,Monitor提供了使线程共享资源的方案。Monitor类可以锁定一个对象,一个线程只有得到这把锁才可以对该对象进行操作。如:Monitor.Enter(obj);\/\/现在oQueue对象只能被当前线程操纵了 Monitor.Exit(obj);6.一个进程开始时至少会有一个主线程 ...

C#多线程跳来跳去的问题
1)设计一个执行长任务的类 LongTask \/\/\/ \/\/\/ 采用单一实例(Singleton)模式实现的长任务多线程后台处理类 \/\/\/ public class LongTask { private static LongTask instance = null; public static LongTask Instance { get { if (instance == null) instance = ...

C#多线程编程实例
它首先进入临界区(用以在多线程环境下保证活动线程数目的操作的正确性)判断当前活动线程的数目 如果有写线程(m_nActive< )存在 则等待指定的时间并且等待的阅读线程数目加 如果当前活动线程是读线程(m_nActive>= ) 则可以让读线程继续运行 申请写入锁的函数原型为 public void AcquireWriterLock( int ...

C# 多线程数据混乱的问题
多线程操作中,各个线程如果是同时运行的话,他们的执行先后顺序是不确定的,多线程就这样,即使它偶然出现了跟你预期的顺序一样,那也只是巧合罢了 而且你多线程里有都是用了textBox1这个资源,他们会抢用,按理说你应该在各个线程中先把这个资源锁住,用完了以后再释放 ...

相似回答
大家正在搜