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
}
什麼行凍結?對「SubscribeToChannels」的調用?您的任何事件處理程序是否在此時被調用? – Snixtor
「chan_OnUnSubscribe」事件處理程序執行後,應用程序會凍結 – user853710
在這種情況下,您應該更新您的問題。你的問題說,應用程序凍結*「只要我訂閱它」*,但現在你說它發生在* Un *訂閱事件處理程序中? – Snixtor