C#异步委托,线程调度。

3

我是一个完全不懂线程的新手,正在尝试理解基础知识。我有这段使用异步委托调用的代码:

static void Main(string[] args)
{      
   Action<Thread, string> action = (mainThread, name) =>
        {
            Thread.CurrentThread.Name = name;
            Thread.CurrentThread.IsBackground = false;
            Console.WriteLine("Thread {0} starts", Thread.CurrentThread.Name);
            while (true)
            {
                var input = Console.ReadLine();
                Console.WriteLine("Thread {0} catches an input. User's input is: \"{1}\""
                                  +"\nMain thread is alive = {2}",
                                  Thread.CurrentThread.Name, input, mainThread.IsAlive);
            }
        };
    action.BeginInvoke(Thread.CurrentThread,"First", null, null);
    action.BeginInvoke(Thread.CurrentThread, "Second", null, null);
    Thread.Sleep(2000);
}

无论我做什么,输出结果总是按照以下顺序:第一 -> 第二 -> 第一 -> 第二 -> 第一...
如我所知,输出顺序应该是不确定的。但在这种情况下它是确定的。线程队列是如何处理的?我漏掉了什么?请解释。

1
如果你想检查多线程,请尽量避免用户输入,我相信Console.ReadLine内部有一个锁,使它们轮流执行。 - OopsUser
他们正在共享同一个控制台。 - Keith Payne
我不知道甚至可以安全地从控制台读取。那在哪里有记录? - usr
@usr,你可以安全地写入它,为什么不安全地读取呢? - i3arnon
@I3arnon 如果没有文档记录,你就不能这样做,因为你无法确定。我只是不知道是否有保证。同时阅读也本质上是竞争的。我不知道谁会这样做。 - usr
显示剩余2条评论
1个回答

4

当你等待用户在var input = Console.ReadLine();输入时,基本上就是锁定了你的线程。第一个线程等待输入并在接收到输入后打印它。而另一个线程在此同时已经请求输入并在等待它。因此,你会得到每个线程一个输入行。

如果你移除ReadLine并使用这行代码代替:

var input = "Hamster";

你将会得到你想要的结果:

这里输入图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接