订阅,取消订阅和发布实现了发布/订阅消息范式(引自wikipedia),发送者(发布者)不是计划发送消息给特定的接收者(订阅者)。而是发布的消息分到不同的频道,不需要知道什么样的订阅者订阅。订阅者对一个或多个频道感兴趣,只需接收感兴趣的消息,不需要知道什么样的发布者发布的。这种发布者和订阅者的解耦合可以带来更大的扩展性和更加动态的网络拓扑。
订阅信道
消息推送
在这里我就不介绍相关发布和订阅的命令,网上太多了,一搜一大堆;
开始对redis相关dll的引用,可以通过通过NuGet获取对ServiceStack.Redis的引用
下面是我自己定义的一个winform界面,主要用来订阅和发布
public Form1()
{
Control.CheckForIllegalCrossThreadCalls = false;
InitializeComponent();
}
/// <summary>
/// 订阅
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
Subscription(this.textBox2.Text);
}
/// <summary>
/// 发布
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
RedisPublish();
}
#region 自定义方法
/// <summary>
/// 订阅
/// </summary>
/// <param name="strTo">订阅主题</param>
public void Subscription(string strTo)
{
Task.Factory.StartNew(() =>
{
try
{
using (var consumer = new RedisClient("192.168.16.207", 6379, "123456"))
{
//创建订阅
IRedisSubscription subscription = consumer.CreateSubscription();
//接受到消息时的委托
subscription.OnMessage = (channel, msg) =>
{
this.textBox1.AppendText("频道【" + channel + "】订阅客户端接收消息:" + ":" + msg + " [" + DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + "]"+ Environment.NewLine + Environment.NewLine);
this.textBox1.AppendText("订阅数:" + subscription.SubscriptionCount + ""+ Environment.NewLine + Environment.NewLine);
};
//订阅事件处理
subscription.OnSubscribe = channel => { this.textBox1.AppendText("订阅客户端:开始订阅" + channel + "" + Environment.NewLine + Environment.NewLine); };
//取消订阅事件处理
subscription.OnUnSubscribe = a => { this.textBox1.AppendText("订阅客户端:取消订阅" + Environment.NewLine + Environment.NewLine); };
subscription.SubscribeToChannels(strTo);//注意:订阅信道的时候 会开启阻塞模式,所以,需要将监听放到单独的线程里
}
}
catch (Exception ex)
{
this.textBox1.AppendText(ex.Message);
}
});
}
/// <summary>
/// 发布
/// </summary>
public void RedisPublish()
{
using (IRedisClient publisher = new RedisClient("192.168.16.207", 6379, "123456"))
{
publisher.PublishMessage(this.textBox3.Text,this.textBox4.Text);
}
}
效果图就是这样的
报线程间操作无效: 从不是创建控件“textBox1”的线程访问它。请加上Control.CheckForIllegalCrossThreadCalls = false;
到此为止就完咯