Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 2线程和无限循环c中的二进制读取器#_C#_Multithreading_Binaryreader - Fatal编程技术网

C# 2线程和无限循环c中的二进制读取器#

C# 2线程和无限循环c中的二进制读取器#,c#,multithreading,binaryreader,C#,Multithreading,Binaryreader,我正在编写客户端服务器通信器。 现在我到了不知道该怎么办的地步。所以 在我的客户机中,我有两个线程。 在这两个线程中,我使用的是同一个BinaryReader——例如在一个线程中添加新联系人,在无限循环的第二个线程中(等待来自服务器的新消息) 当我添加联系人时,我的应用程序无法正常工作,因为分离线程中的二进制读取器交替读取reply 我意识到我必须使用互斥 这是我的client.class代码: 添加联系人: bw.Write((int)Codes.AddContact);

我正在编写客户端服务器通信器。 现在我到了不知道该怎么办的地步。所以

在我的客户机中,我有两个线程。 在这两个线程中,我使用的是同一个BinaryReader——例如在一个线程中添加新联系人,在无限循环的第二个线程中(等待来自服务器的新消息)

当我添加联系人时,我的应用程序无法正常工作,因为分离线程中的二进制读取器交替读取reply

我意识到我必须使用互斥

这是我的client.class代码:

添加联系人:

      bw.Write((int)Codes.AddContact);
        bw.Write(login);
        mutex.WaitOne();
        int ans = br.ReadInt32(); // waiting for 'ok'
        mutex.ReleaseMutex();
第二个线程(无限循环):

我现在的问题是这一行:

  var action = (Codes)br.ReadInt32();
正在无限期地等待来自服务器的消息,互斥体处于等待状态,因此当我尝试添加新联系人时,我的客户端在此冻结:

  mutex.WaitOne();
有没有办法打断这篇文章,或者你知道更好的解决办法


提前谢谢。

您正在刷新您的文字吗?有必要吗?是的,总是在写入之后。互斥不能解决这个问题。您需要某种更高级别的协议来帮助您决定哪个线程应该是处理特定消息的线程。因此,您可以让一个线程进行读取,并使用一组线程安全队列来分发它们。顺便说一句,“消息总线”和“发布/订阅模式”是中间件的流行语。
  mutex.WaitOne();