从LinqPad#2中的课程运行

时间:2014-01-30 16:17:44

标签: c# linqpad

如何在LinqPad中运行以下代码 C#Program 谢谢......

class ThreadTest
{
    static void Main()
    {
        Thread t = new Thread (WriteY);          // Kick off a new thread
        t.Start();                               // running WriteY()

        // Simultaneously, do something on the main thread.
        for (int i = 0; i < 1000; i++) Console.Write ("x");
    }

    static void WriteY()
    {
        for (int i = 0; i < 1000; i++) Console.Write ("y");
    }
}

预期结果

xxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

到目前为止,我想出了

static void Main()
{
    Thread t = new Thread (ThreadTest.WriteY);          // Kick off a new thread
    t.Start();                                          // running WriteY()

    // Simultaneously, do something on the main thread.
    for (int i = 0; i < 1000; i++) Console.Write ("x");
}

class ThreadTest
{
    public static void WriteY()
    {
        for (int i = 0; i < 1000; i++) Console.Write ("y");
    }
}

实际结果

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx...yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy...

结果预期所示,它应该是X和Y混合 不幸的是,实际结果是X的1000倍和Y的1000倍

  

更新

     

此示例 - 以及Nutshell中C#5的并发章节中的所有其他示例都可以作为LINQPad示例库下载。转到LINQPad的样本TreeView,然后单击“下载/导入更多样本”并选择第一个列表。 - Joe Albahari

2 个答案:

答案 0 :(得分:3)

线程切换本质上是非确定性的。我可以多次运行你的程序并获得不同的结果。

如果您希望切换更明显,请添加一些暂停:

static void Main()
{
    Thread t = new Thread (ThreadTest.WriteY);          // Kick off a new thread
    t.Start();                                          // running WriteY()

    // Simultaneously, do something on the main thread.
    for (int i = 0; i < 1000; i++) 
    {
         Console.Write ("x");
         Thread.Sleep(1);
    }
}


class ThreadTest
{
    public static void WriteY()
    {
         for (int i = 0; i < 1000; i++) 
         {
             Console.Write ("y");
             Thread.Sleep(1);
         }
    }
}

答案 1 :(得分:1)

我无法解释为什么这样可行,但改为使用Dump()似乎使其行为类似于OP想要的x和y与每次运行“混合”(尽管每个输出之间有换行符):

void Main()
{
    Thread t = new Thread (ThreadTest.WriteY);          // Kick off a new thread
    t.Start();                                          // running WriteY()

    // Simultaneously, do something on the main thread.
    for (int i = 0; i < 1000; i++) "x".Dump();
}

class ThreadTest
{
    public static void WriteY()
    {
        for (int i = 0; i < 1000; i++) "y".Dump();
    }
}

来自LinqPAD documentation

  

LINQPad的转储命令将输出反馈到XHTML流中   使用嵌入式Web浏览器进行显示(您可以看到这一点   右键单击查询结果并选择“查看源”。该   转换为XHTML完全是使用LINQ to XML完成的   大LINQ查询!结果的延期扩展通过   JavaScript,这意味着XHTML在查询后完全预先填充   完成执行。 lambda窗口使用自定义填充   表达式树访问者(简单地在表达式树上调用ToString   是不好的,因为它将整个输出放在一行上。)

我也知道LinqPAD会覆盖默认的Console.WriteLine behavior,所以也许这与它有关。