【问题标题】:chat client with redis in c# freezes. Anyone can suggest anything?c# 中使用 redis 的聊天客户端冻结。任何人都可以提出任何建议吗?
【发布时间】:2015-04-28 19:31:55
【问题描述】:

我正在Winforms中基于ServiceStack和Redis做一个聊天客户端。

我创建了一个消息集合,当我订阅它时,我的应用程序冻结无响应。我是否可能遗漏了某些东西,或者是否缺少调用。或者什么.....

这里是代码

 
public partial class frmChat :Form
{

public RedisClient redisClient = new RedisClient("192.168.111.50");
public bool registered = false;
public string channelName = "letzChat";

public frmChat()
{
    InitializeComponent();
}

private void tbxUsername_KeyPress(object sender, KeyPressEventArgs e)
{
    if (tbxUsername.Text.Trim() != string.Empty && e.KeyChar == (char) Keys.Enter)
    {
        IRedisSubscription rs = redisClient.CreateSubscription();
        rs.OnSubscribe = chan => { chan_OnSubscribe(chan); };

        rs.OnUnSubscribe = chan => { chan_OnUnSubscribe(chan); };
        rs.OnMessage = (chan, msg) => { chan_OnMessage(chan, msg); };

        rs.SubscribeToChannels(channelName);
    }
}

private void chan_OnMessage(string chan, string msg)
{
    WriteLine(msg+"\n");
}

private void chan_OnUnSubscribe(string chan)
{
    registered = false;
    tbxUsername.Enabled = true;
    SendMessage(string.Format("User {0} registered to channel {1}", tbxUsername.Text, channelName));
}

private void chan_OnSubscribe(string chan)
{
    registered = true;
    tbxUsername.Enabled = false;
}

private void WriteLine(string msg)
{
    foreach (var line in msg.Split('\n'))
    {
        tbxChat.Text += line + Environment.NewLine;
    }
}

private void btnSend_Click(object sender, EventArgs e)
{
    SendMessage();
}

private void tbxMessage_KeyPress(object sender, KeyPressEventArgs e)
{
    if(e.KeyChar == (char)Keys.Enter)
    {
        SendMessage();
    }
}

#region Message Sending
private void SendMessage()
{
    if (tbxMessage.Text.Trim() != string.Empty)
    {
        var m = string.Format("{0}: {1}", tbxUsername.Text, tbxMessage.Text);
        redisClient.PublishMessage(channelName, m);
        tbxMessage.Text = string.Empty;
    }
}

private void SendMessage(string msg)
{
    redisClient.PublishMessage(channelName, msg);
}
#endregion

}

【问题讨论】:

  • 冻结在哪一行?打电话给SubscribeToChannels?您的任何事件处理程序是否在此时被调用?
  • 应用程序在“chan_OnUnSubscribe”事件处理程序执行后冻结
  • 在这种情况下,您应该更新您的问题。您的问题是应用程序冻结“一旦我订阅它”,但现在您说它发生在 Unsubscribe 事件处理程序中?
  • 抱歉,我的网站出错了。它的“chan_OnSubscribe”。问题的标题仍然有效。
  • 我将事件处理程序(动作处理程序)中的代码输入到方法调用程序中,实际上我开始尝试发布消息。一旦我尝试发布,我就会收到以下错误消息,我无法在线找到任何信息“在这种情况下仅允许 (P)SUBSCRIBE / (P)UNSUBSCRIBE / QUIT,sPort:17208,LastCommand:”跨度>

标签: c# winforms redis servicestack


【解决方案1】:

我只是偶然发现了这个问题,因为我遇到了类似的问题并找到了解决方案。

显然,SubscribeToChannels() 和 SubscribeToChannelsMatching() 方法阻塞了线程。以下对我有用:

System.Threading.ThreadPool.QueueUserWorkItem(x =>
{
    GetSubscription().SubscribeToChannelsMatching("__keyevent*:*");
});

有关如何处理退订,请参阅Redis Pub/Sub ServiceStack, cancelling the thread

【讨论】:

    猜你喜欢
    • 2023-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-07-10
    相关资源
    最近更新 更多