【问题标题】:How to use threads which will receive same data at the same time?如何使用将同时接收相同数据的线程?
【发布时间】:2012-01-20 21:37:47
【问题描述】:

我想在 c# 中创建控制台应用程序,它将连接到本地推送服务器并接收来自它的消息。

我已经创建了一个应用程序,该应用程序能够从推送服务器读取响应,以使用以下代码进行“单一”连接:

   HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://192.168.15.174/MvisumPushServer/PushServer.ashx?op=2&DeviceUniqueID=50211&ConnectionTimeout=30&ConnectionMechanism=Wifi&OSVersion=10&DeviceMake=Android&DeviceModel=sdk");

   HttpWebResponse response = (HttpWebResponse)request.GetResponse();
   Stream stream = null;
   stream = response.GetResponseStream();
   StreamReader reader = new StreamReader(stream);
   s = reader.ReadLine();
   Console.WriteLine(s);

现在我想使用线程为单个程序的 5 个或更多连接做同样的事情。 这些许多连接应单独接收所有消息并将其显示到控制台。例如,如果从控制台上的推送服务器生成 5 个通知,则应编写总共 25 个警报,即每个连接从推送服务器接收每条消息。我已经使用 Lock(this) 尝试过,但控制台上总共显示了 5 个警报。

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    如果重要的话,您的方法是关于定期开启的设备。这意味着,如果您想测试服务器,则必须使用计时器执行轮询。
    一组计时器使用您已有的代码以特定或随机的时间间隔调用例程将完成这项工作,只要当您使用线程安全队列将响应排入队列并分别将它们出列并将它们写入控制台时。此外,如果您将 DeviceUniqueID 连接到每个计时器(具有相同长度的另一个数组),此例程可能会接受不同的 DeviceUniqueID(作为参数)。

    【讨论】:

      【解决方案2】:

      我怀疑问题实际上是锁。我怀疑某些线程正在获取锁,然后在 ReadLine 上阻塞,从而阻止其他线程取得进展。假设 WriteLine 是线程安全的,您应该能够在五个线程中毫无问题地执行上面的代码。

      【讨论】:

        【解决方案3】:

        听起来您的线程方法不是问题的原因。听起来您的服务器每个连接(5 个连接)发送一个事件,而不是每个连接发送五个事件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-26
          • 2019-12-10
          • 2018-12-23
          相关资源
          最近更新 更多