c#中的简单线程未按预期工作

c#中的简单线程未按预期工作,c#,multithreading,C#,Multithreading,我跟在后面 min 12:13中的视频说程序应该在名为t的线程上运行循环,然后从主线程运行代码。所以在输出中,我应该看到ThreadProc 0-9,然后是来自主线程的4次消息——与我所知道的正好相反 问题是怎么了。根据screencast,代码看起来很相似 守则: 名称空间目标\u 1.\u 1{ 内部课程计划 { 公共静态void ThreadMethod() { 对于(变量i=0;i

我跟在后面

min 12:13中的视频说程序应该在名为t的线程上运行循环,然后从主线程运行代码。所以在输出中,我应该看到ThreadProc 0-9,然后是来自主线程的4次消息——与我所知道的正好相反

问题是怎么了。根据screencast,代码看起来很相似

守则:

名称空间目标\u 1.\u 1{
内部课程计划
{
公共静态void ThreadMethod()
{
对于(变量i=0;i<10;i++)
{
WriteLine(“ThreadProc{0}”,i);
睡眠(0);
}
}
公共静态void Main()
{
var t=新线程(ThreadMethod);
t、 Start();
//主线程上的循环
对于(变量i=0;i<4;i++)
{
WriteLine(“主线程:做一些工作”);
睡眠(0);
}
//不要传递这行代码并退出main,直到线程t完成
t、 Join();
}
} }
当用户运行时,结果如下:

编辑

结果

线程。睡眠(5)

基本上

编辑2

预期结果:

所以在输出中,我应该看到ThreadProc 0-9,然后是4次消息 从主线程-正相反,我所知道的


您首先看到来自主线程的写入,因为初始化子线程的时间需要一段时间,稍后才开始-同时,主线程将保持运行并执行其操作。

由于您正在执行多线程处理,因此无法保证在不给线程更高优先级的情况下线程的运行顺序。IMO,仅仅因为您希望先运行线程,然后再运行主线程,这就违背了多线程的目的。您可能还没有开始生成线程。正如Yair Nevet所说,主线程只是在线程初始化和启动之前保持运行。对于“真正的”多线程,我本来希望您的输出是混合的,但这也不能像pm100评论的那样得到保证


现在,要回答有关使线程在主线程之前完成的问题,请将Thread.Join()移动到主线程中for循环的上方,您将获得所需的预期输出。

将main中的sleep更改为sleep(5)-只是为了查看,在启动子线程后,需要在主线程上执行非零睡眠,以允许它首先运行。不过,如果循环中的睡眠时间更长,可能会更有趣。在应用程序中使用睡眠通常意味着线程在一开始就考虑得不够周全,但如果必须的话;使用.sleep(1)作为sleep(0)是有问题的。如果视频在两个线程上都有sleep 0,并且如果我在5的主线程中更改sleep,根据屏幕广播,仍然没有预期的结果。您不应该期望以任何顺序看到消息-它高度依赖于工作站与服务器、OS版本、.Net版本、机器电源、,并发加载,。。。。
namespace Objective_1._1 {


   internal class Program

{
    public static void ThreadMethod()
    {
        for (var i = 0; i < 10; i++)
        {
            Console.WriteLine("ThreadProc {0}", i);
            Thread.Sleep(0);
        }
    }

    public static void Main()
    {
        var t = new Thread(ThreadMethod);
        t.Start();

        // Loop on the main thread
        for (var i = 0; i < 4; i++)
        {
            Console.WriteLine("Main thread: Do some work");
            Thread.Sleep(0);
        }

       //Do not pass this line of code and exit the main until thread t finish
        t.Join();
    }
} }