新手创建多线程显示字符数组遇错误:无法将void转换为System.Threading.ThreadStart
解决Thread构造函数的"cannot convert void to System.Threading.ThreadStart"错误
嘿,这个问题我太熟悉了!咱们先搞清楚错误的根源:
你现在写的new Thread(Display(GenerateArray(length))),其实是先执行了Display(GenerateArray(length))这个方法(它返回void),然后把这个void结果传给Thread的构造函数。但Thread构造函数需要的是一个ThreadStart委托——简单说就是一个“方法的引用”,让线程启动时再去执行这个方法,而不是你现在这样直接把方法执行后的void结果传进去。
下面给你几个靠谱的解决方案,按推荐程度排序:
方案1:用Lambda表达式(最简洁,推荐新手)
直接用lambda创建一个无参数的委托,把你的方法调用包在里面,这样线程启动时才会执行这段逻辑:
static void Main(string[] args) { Random randLen = new Random(); int length; while (true) { length = randLen.Next(3, 10); // 用lambda把Display调用包起来 Thread thread = new Thread(() => Display(GenerateArray(length))); thread.Start(); // 加个延迟,避免瞬间创建上千个线程耗尽资源 Thread.Sleep(100); } }
方案2:用ParameterizedThreadStart传递参数
如果需要单独传递参数给线程方法,可以用这个方式,不过要先修改Display方法的参数类型:
// 先修改Display方法,把参数改成object,再强转成char[] public static void Display(object arrayObj) { char[] array = (char[])arrayObj; // 你的原有流动字符显示逻辑 } // 然后修改Main里的线程创建代码 static void Main(string[] args) { Random randLen = new Random(); int length; while (true) { length = randLen.Next(3, 10); char[] array = GenerateArray(length); // 传递Display方法的引用,启动时传入array参数 Thread thread = new Thread(Display); thread.Start(array); Thread.Sleep(100); } }
方案3:用Task代替Thread(更现代的异步方式)
.NET现在更推荐用Task来处理多线程/异步操作,比直接用Thread更灵活,代码也简洁:
static void Main(string[] args) { Random randLen = new Random(); int length; while (true) { length = randLen.Next(3, 10); // 用Task.Run启动异步任务 Task.Run(() => Display(GenerateArray(length))); Thread.Sleep(100); } }
这个方式不需要改原有Display方法,而且后续如果需要处理任务完成、异常等场景,会比Thread方便很多。
最后提醒一句:你的代码是无限循环创建线程,一定要加个Thread.Sleep()或者其他节流逻辑,不然很快就会创建几百上千个线程,把系统资源吃光,程序会卡爆甚至崩溃。
内容的提问来源于stack exchange,提问作者MRed
相关产品推荐
相关产品推荐

