我第一次用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 (!