首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确使用NetMq Poller接收数据

如何正确使用NetMq Poller接收数据
EN

Stack Overflow用户
提问于 2018-11-29 14:44:51
回答 1查看 1.6K关注 0票数 5

我的任务是创建一个接口,通过套接字从发送方接收数据,为此,我使用NetMQ PushSocket作为发送方,然后在客户端接收PullSocket,当收到数据时,我必须更新UI (WPF应用程序),所以当我在独立服务类中使用ReceiveReady事件中的计票器接收数据,并在UI ViewModel中调用该类时,线程挂起,所以我在任务中使用Poller.Run,现在的问题是,当我停止计票程序,然后重新启动它时,它不会调用ReceiveReady事件。

这是用于接收数据的ReceiverService。

代码语言:javascript
复制
public class ReceiverService
{
    string msg;
    string _address;
    int _port;
    PullSocket receiver;
    NetMQPoller poller;
    private MapViewModel ViewModel { get; set; }
    public ReceiverService(MapViewModel mapViewModel, int port = 5555)
    {
        _address = GetComputerLanIP();
        _port = port;
        receiver = new PullSocket($"tcp://{_address}:{_port}");
        receiver.Options.Linger = TimeSpan.Zero;             
        this.ViewModel = mapViewModel;
        poller = new NetMQPoller { receiver };
        receiver.ReceiveReady += receiver_ReceiveReady;
    }
    public void Start()
    {
        receiver.Connect($"tcp://{_address}:{_port}");
        poller.Run();
    }
    public void Stop()
    {
        receiver.Disconnect($"tcp://{_address}:{_port}");
        poller.Stop();
    }

    private void receiver_ReceiveReady(object sender, NetMQSocketEventArgs e)
    {
        // receive won't block as a message is ready
        msg = e.Socket.ReceiveFrameString();
        // send a response
        if (!string.IsNullOrEmpty(msg))
        {
            try
            {
              //Updaing the ViewModel here
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
            }
        }
    }
    private string GetComputerLanIP()
    {
        string strHostName = Dns.GetHostName();
        IPHostEntry ipEntry = Dns.GetHostEntry(strHostName);

        foreach (var ipAddress in ipEntry.AddressList)
        {
            if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
            {
                return ipAddress.ToString();
            }
        }
        return "";
    }
    private string GetValueFromMessage(string identifier)
    {
        msg.Replace("{", "");
        msg.Replace("}", "");
        identifier = /*" " + */identifier + " = ";
        try
        {
            int index = msg.IndexOf(identifier) + identifier.Length;

            if (index != -1)
            {
                int index2 = msg.IndexOf(";", index);
                if (index2 == -1)
                {
                    index2 = msg.Length;
                }
                return msg.Substring(index, index2 - index);
            }
        }
        catch (IndexOutOfRangeException ex)
        {
            return null;
        }
        return null;
    }
}

在我的ViewModel中,我设置了这些命令

代码语言:javascript
复制
private void StartReceiver()
    {
     Task.Run(() => ReceiverService.Start());           
    }
private void StopReceiver()
    {           
     Task.Run(() => ReceiverService.Stop());                         
    }

我做错了什么?我是NetMQ和WPF的新手。提亚

EN

回答 1

Stack Overflow用户

发布于 2019-02-11 09:20:31

  1. 首先,在ReceiverService (某种ActorModel )中创建一个任务是很好的,因为最后,如果您想在需要的任何地方重用它,请记住,您应该首先创建一个任务。
  2. 始终在使用语句时使用套接字是很好的,因为如果不使用套接字,则应该始终关闭它。
代码语言:javascript
复制
 public async Task StartAsync()        {
     await Task.Run(() => ThreadBody())
 }
 public void Stop()
 {
     _poller.Stop();
 }
     private void ThreadBody()
 {
     using (PullSocket receiverSocket = new PullSocket())
     using (_poller = new NetMQPoller())
     {
         receiverSocket.Connect($"tcp://{_address}:{_port}");
         receiverSocket.ReceiveReady += receiver_ReceiveReady;
         _poller.Add(receiverSocket);
         _poller.Run();
     }
 }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53541567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档