Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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#如何在数据通信中实现等待确认?_C#_Events_Blocking_Wait - Fatal编程技术网

C#如何在数据通信中实现等待确认?

C#如何在数据通信中实现等待确认?,c#,events,blocking,wait,C#,Events,Blocking,Wait,我有一个类,它应该以包的形式发送/接收数据。此类包含一个事件处理程序,该处理程序在可从物理介质读取新数据时运行 在事件处理程序中,我从媒体读取数据,并解析完整数据包的可用数据。一旦识别出一个数据包,就会引发一个事件,将新数据包传递给订阅者。此事件的订阅者决定是否要使用数据包 到目前为止还不错。。。现在回答我的问题。虽然上面的场景可以将传入的数据分发给多个订阅者,并在应用程序中进一步放置进一步的处理逻辑,但这给我留下了一个问题: 有时,类将接收到一个数据包,该数据包只是对该类发送的另一个数据包的回

我有一个类,它应该以包的形式发送/接收数据。此类包含一个事件处理程序,该处理程序在可从物理介质读取新数据时运行

在事件处理程序中,我从媒体读取数据,并解析完整数据包的可用数据。一旦识别出一个数据包,就会引发一个事件,将新数据包传递给订阅者。此事件的订阅者决定是否要使用数据包

到目前为止还不错。。。现在回答我的问题。虽然上面的场景可以将传入的数据分发给多个订阅者,并在应用程序中进一步放置进一步的处理逻辑,但这给我留下了一个问题:

有时,类将接收到一个数据包,该数据包只是对该类发送的另一个数据包的回复(想想ACK/FAIL)

我如何实现一种方法来发送等待确认的内容,同时不破坏上述在事件处理程序中处理传入原始数据的概念?

一些伪代码来说明问题:

class CommCenter
{
    public event NewPacketAvailable;

    private void _newRawDataAvailable_EventHandler
    {
        // read incoming data from physical medium

        // parse incoming data for packet structure
        // the received packet may either contain a reply to
        // a previously sent message or unrelated

        // if packet found raise NewPacketAvailable event
        // so that subscribers can handle the packet
    }


    public void SendMessage(DataPacket packet, Int32 timeoutInMilliseconds)
    {
        // put message on the physical medium

        // wait for a packet confirming the previously sent packet
        // How would I have to do this??
        // the packet confirmation would arrive in _newRawDataAvailable_EventHandler
    }
}

也许有一个好主意,甚至以前实现过这样的逻辑。我现在有点困惑该怎么办。很高兴能为您提供正确方向的帮助或指点;-)

好的,这就是它的工作原理:

在事件处理程序中,从介质读取数据。检查它是否是数据或只是对前一个数据包(ACK)的确认

如果是数据,请将其传递给其他人

如果是ACK,则将其放入ACK专用的
队列中

在发送消息后,在
SendMessage
方法中迭代此确认
队列
,直到:

  • 超时发生
  • 您发送的数据包的确认到达

  • 就这样

    好的,这就是它的工作原理:

    在事件处理程序中,从介质读取数据。检查它是否是数据或只是对前一个数据包(ACK)的确认

    如果是数据,请将其传递给其他人

    如果是ACK,则将其放入ACK专用的
    队列中

    在发送消息后,在
    SendMessage
    方法中迭代此确认
    队列
    ,直到:

  • 超时发生
  • 您发送的数据包的确认到达

  • 就这样

    是的,请看我的答案,了解我是如何解决问题的。如果您需要任何详细信息,请告诉我,我很乐意详细说明。是的,请参阅我的答案,了解我是如何解决问题的。如果你需要任何细节,请告诉我,我很乐意详细说明。