C# Console.writeline()多线程问题

C# Console.writeline()多线程问题,c#,.net,multithreading,thread-safety,thread-synchronization,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

我试图模拟一个聊天客户端。首先是代码

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秒钟才能输入的内容。然后,它不再自动在下一行打印消息,而是添加到我正在键入的内容中。我对多线程非常陌生,所以我不确定问题出在哪里。我认为这两个线程使用的是同一个控制台类


在这方面,我们将不胜感激。

使用
控制台来描述类似聊天的应用程序是不切实际的。如果您真的想看到它工作,请尝试使用
WinForm
WPF
应用程序,在
控件
的形式中,您有很多选项可以显示
facebook
如使用
ListBox
控件等进行聊天


显然这是一种方法,但在
控制台中实现它确实很困难
使用
控制台
来描述类似聊天的应用程序是不实际的。如果您真的想看到它工作,请尝试使用
WinForm
WPF
应用程序,在
控件
的形式中,您有很多选项可以显示
facebook
如使用
ListBox
控件等进行聊天


显然,这是一种方法,但在
控制台中实现它确实很困难

在控制台中实现聊天客户端非常困难。这是可能的,但一点也不琐碎

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

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


在winform中做任何事情都要容易得多。要写出信息,只需将其添加到输出文本框中的文本中;要读取信息,当按下“发送”按钮或enter键时,只需清除输入文本框并处理其内容。您不必担心这两者之间的交互。

在控制台中实现聊天客户端非常困难。这是可能的,但一点也不琐碎

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

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

在winform中做任何事情都要容易得多。要写出信息,只需将其添加到输出文本框中的文本中;要读取信息,当按下“发送”按钮或enter键时,只需清除输入文本框并处理其内容。你不必担心这两者之间的相互作用。

Lol 2ez

    public static void WriteLineMultithread(string strt) {
        int lastx=Console.CursorLeft,lasty=Console.CursorTop;

        Console.MoveBufferArea(0,lasty,lastx,1,0,lasty+1,' ',Console.ForegroundColor,Console.BackgroundColor);
        Console.SetCursorPosition(0,lasty);
        Console.WriteLine(strt);
        Console.SetCursorPosition(lastx,lasty+1);
    }
此方法允许您在用户在另一个线程上使用“Console.ReadLine()”时编写消息。我假设您的聊天消息的接收是异步的,或者发生在另一个线程上

您可以添加一些lock(){},这将非常完美。

Lol 2ez

    public static void WriteLineMultithread(string strt) {
        int lastx=Console.CursorLeft,lasty=Console.CursorTop;

        Console.MoveBufferArea(0,lasty,lastx,1,0,lasty+1,' ',Console.ForegroundColor,Console.BackgroundColor);
        Console.SetCursorPosition(0,lasty);
        Console.WriteLine(strt);
        Console.SetCursorPosition(lastx,lasty+1);
    }
此方法允许您在用户在另一个线程上使用“Console.ReadLine()”时编写消息。我假设您的聊天消息的接收是异步的,或者发生在另一个线程上


您可以添加一些lock(){},这将非常完美。

在我们帮助您实现之前,您需要弄清楚您希望程序如何响应。您是否希望打印出来的信息等到他们输入完信息后才显示出来?这可以通过几个
lock
语句来实现。您想要一个单独的区域来显示和输入文本吗?这很可能需要一个比shell更复杂的UI。考虑一个具有两个多行文本框的窗体。如果您想在控制台中模拟该功能,这将是……困难的。@L.B好的……这很糟糕。所以我猜我想要什么是不可能的?@WinCoder你没有告诉我们你想要什么,你只是告诉我们你做了什么,说它做不了你想要的。facebook聊天没有在控制台中实现。我个人从未使用过基于shell的IM客户端,我只使用过在web/桌面UI中编写的IM客户端。如果您想模仿这一点,最好只制作一个winform/WPF应用程序。就像我说的,只要在一个窗体/窗口上放置两个文本框,您就已经准备好了。在我们帮助您实现之前,您需要弄清楚您希望程序如何响应。您是否希望打印出来的信息等到他们输入完信息后才显示出来?这可以通过几个
lock
语句来实现。您想要一个单独的区域来显示和输入文本吗?那将是一个巨大的挑战