2013-04-17 26 views
1

我正在Winforms基於ServiceStack和Redis的聊天客戶端。用c#凍結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

}

+0

什麼行凍結?對「SubscribeToChannels」的調用?您的任何事件處理程序是否在此時被調用? – Snixtor

+0

「chan_OnUnSubscribe」事件處理程序執行後,應用程序會凍結 – user853710

+0

在這種情況下,您應該更新您的問題。你的問題說,應用程序凍結*「只要我訂閱它」*,但現在你說它發生在* Un *訂閱事件處理程序中? – Snixtor

回答

1

我只是偶然發現了這個問題,因爲我也有類似的問題,並找到了解決辦法。

顯然,SubscribeToChannels()和SubscribeToChannelsMatching()方法會阻塞該線程。以下爲我工作:

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

Redis Pub/Sub ServiceStack, cancelling the thread對於如何處理退訂。