日期:2014-05-18  浏览次数:20720 次

我第一次用c#编程序 想请教一个问题
public static AutoResetEvent Single_1 = new AutoResetEvent(false);
  public static EventWaitHandle Single_2 = new EventWaitHandle(true, System.Threading.EventResetMode.ManualReset);
class Program
  {
  static void Main(string[] args)
  {
  My_Server my_server = new My_Server();
  My_Thread new_Thread = new My_Thread();
  My_Thread.Use_Server = my_server;
  string input_word = "";
  while (true)
  {
  My_Thread.Single_2.WaitOne(50);
  input_word = Console.ReadLine();
  if (input_word != "#00")
  {
  my_server.Input(input_word);
  My_Thread.Single_1.Reset();
  My_Thread.Single_2.Set();
  Thread.Sleep(80);
  Console.Write("服务器:");
  Console.Write(input_word);
  }
  else
  {
  my_server.QUIT = true;
  break;
  }
  }
  My_Thread.Listen.Join();
  My_Thread.Speak.Join();
  return;
  }
  };
这两个是线程函数
  static void Do_Listen(object data)
  {
  while (!Use_Server.QUIT)
  {
  if (Use_Server.server.Receive(Use_Server.message_in) != 0)
  {
  Console.Write("客户端:");
  string string_in = System.Text.Encoding.Default.GetString(Use_Server.message_in);
  Console.Write(string_in);
  }
  }
  }
  static void Do_Speak(object data)
  {
  while (!Use_Server.QUIT)
  {
  Single_1.WaitOne(50);
  Use_Server.server.Send(Use_Server.message_out);
  Single_2.Reset();
  Thread.Sleep(80);
  }
  }

这是我自己随写着玩的一个聊天程序。VC++写运行良好,但是用C#这两个线程函数就怎么也运行不好。WaitOne()这个方法要么就一直挂起我的线程,要不就一直不挂起我的线程。十分郁闷。在这里我想问问我的两个事件哪里错了。
我这个设计就是:有文本输入的时候线程发送数据,没有的时候挂起线程。
这么设计只是想了解一下c#的线程管理,只要有人改下语句我就能看明白啦,谢谢。

------解决方案--------------------
从代码粗看,貌似两个互斥锁用混了,最好摘清楚用途再搞,另外,异步聊天也可以设计成异步通信方式。

C# code

  public static AutoResetEvent Single_1 = new AutoResetEvent(false);
  public static EventWaitHandle Single_2 = new EventWaitHandle(true, system.Threading.EventResetMode.ManualReset);

class Program
{
   static void Main(string[] args)
   {
     My_Server my_server = new My_Server();
     My_Thread new_Thread = new My_Thread();
     My_Thread.Use_Server = my_server;

     string input_word = "";
     while (true)
     {
       My_Thread.Single_2.WaitOne(50);
       input_word = Console.ReadLine();
       if (input_word != "#00")
       {
         my_server.Input(input_word);
         My_Thread.Single_1.Reset();
         My_Thread.Single_2.Set();   //???一个线程内,自己set自己的waitone()?, 咋set呀
         Thread.Sleep(80);           
         Console.Write("服务器:");
         Console.Write(input_word);
       }
      else
      {
        my_server.QUIT = true;
        break;
      }
    }
 
    My_Thread.Listen.Join();
    My_Thread.Speak.Join();
    return;
  }
};

这两个是线程函数
static void Do_Listen(object data)
{
    while (!