Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我已经创建了两个线程,但是没有一个线程能够命中它应该命中的方法_C#_Multithreading - Fatal编程技术网

C# 我已经创建了两个线程,但是没有一个线程能够命中它应该命中的方法

C# 我已经创建了两个线程,但是没有一个线程能够命中它应该命中的方法,c#,multithreading,C#,Multithreading,我正在学习c#中的多线程&在IDE VS 2019中执行我所有的代码。我已经创建了两个线程,但是没有一个线程命中应该命中的方法(我也使用了断点)。我已经把代码贴在下面了。请告知我做错了什么。另外,这是执行线程的有效方法吗?如果没有,建议一种有效的方法。 提前谢谢。 PS:如果这个问题已经被问到,请分享这个链接。我在谷歌上搜索了我的问题的解决方案,但没有找到令人满意的答案 代码-> class Program { static void Main(string[] args) {

我正在学习c#中的多线程&在IDE VS 2019中执行我所有的代码。我已经创建了两个线程,但是没有一个线程命中应该命中的方法(我也使用了断点)。我已经把代码贴在下面了。请告知我做错了什么。另外,这是执行线程的有效方法吗?如果没有,建议一种有效的方法。 提前谢谢。 PS:如果这个问题已经被问到,请分享这个链接。我在谷歌上搜索了我的问题的解决方案,但没有找到令人满意的答案

代码->

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)模式下给出所需的输出。