Console.writeline()多线程问题

时间:2012-10-30 19:45:44

标签: c# .net multithreading thread-safety thread-synchronization

我正在试图模拟聊天客户端。首先是这里的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace thread
{
    class Program
    {

    public static Thread t1;
    public static Thread t2;
    public static bool flag;
    public static Random rand = new Random();

    static void Main(string[] args)
    {
        t1 = new Thread(first);
        t2 = new Thread(second);
        t1.Start();
        t2.Start();

        Console.Read();
    }

    public static void first()
    {

        string[] phrase = { "Hello", "random", "blah,blah", "computer", "Welcome", "This is chat bot" };
        while (!flag)
        {
            Thread.Sleep(4000);
            Console.WriteLine("{0}", phrase[rand.Next(6)]);
        }
    }

    public static void second()
    {
        string input = "";
        while (input!="x")
        {

            input=Console.ReadLine();
            if (input=="x")
            {
                break;
            }

        }
        flag = true;
    }


   }
}

好的,所以这个程序会在控制台上自动打印一些文字,我也可以在屏幕上写下我的信息。现在的问题是,每当我打字长句时, 任何需要超过4秒钟输入的东西。然后,而不是在下一行打印自动消息,它只是附加到我正在键入的任何内容。我对多线程很陌生,所以我不确定是什么问题。我认为两个线程都使用相同的控制台类。

在这方面可以获得帮助。

3 个答案:

答案 0 :(得分:2)

在控制台中实现聊天客户端非常困难。它可以可能,但它并不是一件轻而易举的事。

在基于GUI的环境中实现它要容易得多,例如winforms,您可以在其中拥有两个完全独立的文本区域,一个用于输入,另一个用于输出。

为了在控制台中执行此操作,您需要在需要显示测试时将光标移动到上一行,写出该文本,然后将光标移回用户使用的位置。输入。但是这样做会覆盖前一行文本,因此在此之前需要在行上写入前一行文本,依此类推,直到你到达缓冲区的顶部,该行可以完全删除。最重要的是,您无法从控制台读取信息,因此您需要跟踪内存中的所有内容,以便完成整个写操作。

在winform中做所有事情要容易得多。要写出信息,只需将其添加到输出文本框中的文本,并在"发送"按下按钮或输入,只需清除输入文本框并处理它的内容。你不必担心这两者之间的相互作用。

答案 1 :(得分:1)

使用Console描述类似聊天的应用程序是不切实际的。如果您真的希望看到它正常运行,请尝试使用WinFormWPF应用程序,您可以通过Controls的形式提供大量选项,以显示facebook,就像聊天一样使用ListBox控件等

显然这是一种方式,但在Console中实现它真的很难。

答案 2 :(得分:1)

Lol 2ez

ceil

此方法允许您在用户使用" Console.ReadLine()"时写入消息。在另一个线程上。我假设您的聊天消息的接收是异步的,或者发生在另一个线程上。

你可以添加一些lock(){},这将是完美的。