C# 我已经创建了两个线程,但是没有一个线程能够命中它应该命中的方法
我正在学习c#中的多线程&在IDE VS 2019中执行我所有的代码。我已经创建了两个线程,但是没有一个线程命中应该命中的方法(我也使用了断点)。我已经把代码贴在下面了。请告知我做错了什么。另外,这是执行线程的有效方法吗?如果没有,建议一种有效的方法。 提前谢谢。 PS:如果这个问题已经被问到,请分享这个链接。我在谷歌上搜索了我的问题的解决方案,但没有找到令人满意的答案 代码->C# 我已经创建了两个线程,但是没有一个线程能够命中它应该命中的方法,c#,multithreading,C#,Multithreading,我正在学习c#中的多线程&在IDE VS 2019中执行我所有的代码。我已经创建了两个线程,但是没有一个线程命中应该命中的方法(我也使用了断点)。我已经把代码贴在下面了。请告知我做错了什么。另外,这是执行线程的有效方法吗?如果没有,建议一种有效的方法。 提前谢谢。 PS:如果这个问题已经被问到,请分享这个链接。我在谷歌上搜索了我的问题的解决方案,但没有找到令人满意的答案 代码-> class Program { static void Main(string[] args) {
class Program
{
static void Main(string[] args)
{
Thread t1 = new Thread(new ThreadStart(SayHiEnglish));
t1.Name = "Starting method SayHiEnglish()";
t1.Start();
Thread t2 = new Thread(new ThreadStart(SayHiSpanish));
t2.Name = "Starting Method SayHiSpanish()";
t2.Start();
//SayHiEnglish();
//SayHiSpanish();
}
static void SayHiEnglish()
{
Console.WriteLine(Thread.CurrentThread);
for (int i = 0; i < 50; i++)
{
Console.WriteLine("Hi in English");
}
}
static void SayHiSpanish()
{
Console.WriteLine(Thread.CurrentThread);
for (int i = 0; i < 50; i++)
{
Console.WriteLine("Hi in Spanish");
}
}
}
类程序
{
静态void Main(字符串[]参数)
{
线程t1=新线程(新线程开始(SayHiEnglish));
t1.Name=“起始方法SayHiEnglish()”;
t1.Start();
线程t2=新线程(新线程开始(Sayispanish));
t2.Name=“起始方法sayispanish()”;
t2.Start();
//SayHiEnglish();
//说西班牙语();
}
静态无效SayHiEnglish()
{
Console.WriteLine(Thread.CurrentThread);
对于(int i=0;i<50;i++)
{
Console.WriteLine(“Hi in English”);
}
}
静态无效Sayispanish()
{
Console.WriteLine(Thread.CurrentThread);
对于(int i=0;i<50;i++)
{
Console.WriteLine(“西班牙语你好”);
}
}
}
我看不出线程本身有什么问题,但是您的程序在线程启动/完成之前就已经退出了。因此,主线程具有“阻塞/等待”功能,因此线程可以执行
class Program
{
static void Main(string[] args)
{
Thread t1 = new Thread(new ThreadStart(SayHiEnglish));
t1.Name = "Starting method SayHiEnglish()";
t1.Start();
Thread t2 = new Thread(new ThreadStart(SayHiSpanish));
t2.Name = "Starting Method SayHiSpanish()";
t2.Start();
//SayHiEnglish();
//SayHiSpanish();
Console.WriteLine("Press RETURN to exit");
Console.ReadLine();
}
static void SayHiEnglish()
{
Console.WriteLine(Thread.CurrentThread);
for (int i = 0; i < 50; i++)
{
Console.WriteLine("Hi in English");
}
}
static void SayHiSpanish()
{
Console.WriteLine(Thread.CurrentThread);
for (int i = 0; i < 50; i++)
{
Console.WriteLine("Hi in Spanish");
}
}
}
类程序
{
静态void Main(字符串[]参数)
{
线程t1=新线程(新线程开始(SayHiEnglish));
t1.Name=“起始方法SayHiEnglish()”;
t1.Start();
线程t2=新线程(新线程开始(Sayispanish));
t2.Name=“起始方法sayispanish()”;
t2.Start();
//SayHiEnglish();
//说西班牙语();
控制台写入线(“按回车键退出”);
Console.ReadLine();
}
静态无效SayHiEnglish()
{
Console.WriteLine(Thread.CurrentThread);
对于(int i=0;i<50;i++)
{
Console.WriteLine(“Hi in English”);
}
}
静态无效Sayispanish()
{
Console.WriteLine(Thread.CurrentThread);
对于(int i=0;i<50;i++)
{
Console.WriteLine(“西班牙语你好”);
}
}
}
使用线程的一种更现代的方法是
Task.Run(()=>{..code here…})代码>,但主线程仍需等待。这是您的代码。它起作用了。按Ctrl+F5运行程序,以避免控制台消失
static void Main(string[] args)
{
StartUtility();
}
private static void StartUtility()
{
Thread thread1 = new Thread(new ThreadStart(SayHiEnglish));
thread1.Start();
Thread thread2 = new Thread(new ThreadStart(SayHiSpanish));
thread2.Start();
}
private static void SayHiEnglish()
{
Console.WriteLine(Thread.CurrentThread);
for (int i = 0; i < 50; i++)
{
Console.WriteLine("Hi in English");
}
}
private static void SayHiSpanish()
{
Console.WriteLine(Thread.CurrentThread);
for (int i = 0; i < 50; i++)
{
Console.WriteLine("Hi in Spanish");
}
}
static void Main(字符串[]args)
{
起始性();
}
私有静态无效开始性()
{
Thread thread1=新线程(新线程开始(SayHiEnglish));
thread1.Start();
Thread thread2=新线程(新线程开始(SayHiSpanish));
thread2.Start();
}
私有静态无效SayHiEnglish()
{
Console.WriteLine(Thread.CurrentThread);
对于(int i=0;i<50;i++)
{
Console.WriteLine(“Hi in English”);
}
}
私有静态无效Sayispanish()
{
Console.WriteLine(Thread.CurrentThread);
对于(int i=0;i<50;i++)
{
Console.WriteLine(“西班牙语你好”);
}
}
您是否尝试过在未连接调试器的情况下运行程序?只需按Ctrl+F5键,看看是否有任何不同的情况发生!对我也试过了。但程序在线程开始/完成之前退出。只需添加Console.ReadLine();在关闭main方法之前,解决了我的问题,因为它阻止了程序退出,并为线程提供了一些额外的时间来执行操作。您尚未将属性设置为true
,默认值为false
,因此这两个线程应保持程序运行。我很惊讶他们没有。谢谢,弗兰克。我已将此答案标记为已接受,因为它已回答了我的所有问题。此外,我还学习了使用threads.Frank的现代方法,正如您所建议的,我使用了Task.Run(()=>{…code…});,但是我认为,现在这些方法是在Task.Run块中顺序执行的。Task.Run(()=>{Console.WriteLine(“运行线程的现代方式”);SayHiEnglish();SayHiSpanish();});我解决了自己的问题——通过从不同线程调用方法,它们现在以非顺序(更快)的方式执行。Task.Run(()=>{Console.WriteLine(“运行线程的现代方式”);SayHiEnglish();});Task.Run(()=>{Console.WriteLine(“运行线程的现代方式”);sayispanish();});谢谢你,艾瑞克。正如Frank所建议的,如果我们在main方法中使用'block/wait'语句来阻止程序在线程开始/完成之前退出,那么您建议的答案也会在调试(F5)模式下给出所需的输出。