using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace Exercise4
{
class MainClass
{
private char c;
public MainClass(char c)
{
this.c = c;
}
public void run()
{
while (true)
{
Console.WriteLine(c);
System.Threading.Thread.Sleep(1000);
}
}
public static void Main(string[] args)
{
Thread thA = new Thread(new ThreadStart(new MainClass('A'), run)); //Error Method Name Excepted : Error Code CS0149
Thread thB = new Thread(new ThreadStart(new MainClass('B'), run)); //Error Method Name Excepted : Error code CS0149
thA.Start();
thB.Start();
thA.Join();
thB.Join();
}
}
}
我是C#的新手,我真的不明白那里出了什么问题。
更确切的说,错误在这里:
new ThreadStart(new MainClass('A') , run )
new ThreadStart(new MainClass('B') , run )
此代码必须创建5个线程,每个线程的第一个显示字母'A',第二个显示字母'B',依此类推。 我试图修改程序,以便每个线程在无限循环中显示其字母。
希望我可以在那里获得帮助!
答案 0 :(得分:2)
您需要先初始化对象,然后才能将这些对象的run
方法传递给ThreadStart
:
public static void Main(string[] args)
{
var mainA = new MainClass('A');
var mainB = new MainClass('B');
Thread thA = new Thread(new ThreadStart(mainA.run));
Thread thB = new Thread(new ThreadStart(mainB.run));
...
POST编辑:附加选项
如果只需要两个初始化对象用于此目的,则可以通过在不声明和设置其他变量的情况下,在同一行中处理初始化来使此初始化稍微优雅一些:
Thread thA = new Thread(new ThreadStart(new MainClass('A').run));
Thread thB = new Thread(new ThreadStart(new MainClass('B').run));
答案 1 :(得分:0)
如果您要调用方法run
,但您应先调用run()
,但先更改名称,则它不会让您调用方法while (true)
{
Console.WriteLine(c);
System.Threading.Thread.Sleep(1000);
}
。也
boolean
由于您使用的是值而不是实际的while
,因此这始终是正确的,而while使它循环,这将导致StackOverflow。将if
更改为{{1}}仅打印一次
答案 2 :(得分:0)
这只是您尝试实例化 MainClass 对象并执行新线程内不正确的 run 函数的方法。
您可以通过如下修改“ public static void Main ”来使代码正常工作:
public static void Main(string[] args)
{
MainClass A = new MainClass('A');
Thread thA = new Thread(new ThreadStart(A.run));
MainClass B = new MainClass('B');
Thread thB = new Thread(new ThreadStart(B.run));
thA.Start();
thB.Start();
thA.Join();
thB.Join();
System.Console.ReadKey();
}