本文实例讲述了C#采用Winform实现类似Android下Listener的方法。非常实用的一个技巧。具体实现方法如下:

首先是一个ICallBackListener接口,里面要写上你需要Listen的方法。
其次,是一个Controller类,类似于工作类,具体的功能可以在这里面实现。

实现代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Listener
{
/// <summary>
/// 回调接口(类似Listener)
/// </summary>
public interface ICallBackListener
{
void onCallBack();
bool onCallBack(string pWhat);
} /// <summary>
/// 控制器类,处理事务
/// </summary>
public class Controller
{
// 执行任务的线程
private Thread mThread; // 控制循环和控制是否处理的Flag
private bool mFlagWhile;
private bool mFlagDoWork; // 接收订阅Listener的回调的集合(Android中的vector)
private List<ICallBackListener> mListenerList; public Controller()
{
// 初始化Listener集合
mListenerList = new List<ICallBackListener>(); // 初始化线程相关
mThread = new Thread(work);
mFlagWhile = true;
mFlagDoWork = true;
} /// <summary>
/// 具体执行的工作
/// </summary>
private void work()
{
while (mFlagWhile)
{
Thread.Sleep();
if (mFlagDoWork)
{
// 执行相应的处理
// 具体处理的工作就在这里
ActiveOnCallBack();
}
Thread.Sleep();
if (mFlagDoWork)
{
// 执行相应的处理
// 具体处理的工作就在这里
ActiveOnCallBack("Test");
}
}
}
/// <summary>
/// 启动Controller处理
/// </summary>
public void Start()
{
if (mFlagWhile)
mThread.Start();
} /// <summary>
/// 关闭Controller处理
/// </summary>
public void Stop()
{
mFlagWhile = false;
mFlagDoWork = false;
mThread.Abort();
} /// <summary>
/// 激活onCallBack()
/// </summary>
private void ActiveOnCallBack()
{
if(mListenerList!=null)
foreach (ICallBackListener tCallBack in mListenerList)
{
tCallBack.onCallBack();
}
}
/// <summary>
/// 激活onCallBack(string)
/// </summary>
/// <param name="pWhat">传入的参数</param>
private void ActiveOnCallBack(string pWhat)
{
if (mListenerList != null)
foreach (ICallBackListener tCallBack in mListenerList)
{
tCallBack.onCallBack(pWhat);
}
}
/// <summary>
/// 设置Listener
/// </summary>
/// <param name="pCallBackListener">继承ICallbackListener接口的类</param>
public void setOnListener(ICallBackListener pCallBackListener)
{
if (pCallBackListener != null)
mListenerList.Add(pCallBackListener);
}
/// <summary>
/// 移除Listener
/// </summary>
/// <param name="pCallBackListener">继承ICallbackListener接口的类</param>
public void removeOnListener(ICallBackListener pCallBackListener)
{
if (pCallBackListener != null)
mListenerList.Remove(pCallBackListener);
}
}
}

接着就是如何使用这个类了,简单的创建一个Winform,一个Button用来停止,一个TextBox用来打印。
具体的用法里面都有注释!便于大家理解。

代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Listener; namespace EventTest
{
// Form一定要继承ICallBackListener并实现其方法
public partial class FormTest : Form, ICallBackListener
{
// UI更新委托
private delegate void DelegateTextBox(string pString); // 控制器
private Controller mController; public FormTest()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
// 初始化控制器,设置侦听,并开始
mController = new Controller();
mController.setOnListener(this);
mController.Start();
} // Override 接口实现
public void onCallBack()
{
// 线程安全处理
if (InvokeRequired)
{
textBox1.Invoke(new DelegateTextBox(pushTextInTextbox), new object[] { null });
}
} // Override 接口实现
public bool onCallBack(string pWhat)
{
// 线程安全处理
if (InvokeRequired)
{
textBox1.Invoke(new DelegateTextBox(pushTextInTextbox), new object[] { pWhat });
}
return false;
} private void button1_Click(object sender, EventArgs e)
{
// 停止控制器
mController.Stop();
} /// <summary>
/// 接收委托的方法,该方法通过Invoke控制UI
/// </summary>
/// <param name="pText">传入的string参数</param>
private void pushTextInTextbox(string pText)
{
if (pText != null)
{
textBox1.Text += "\n当前的处理:" + pText;
}
else
{
textBox1.Text += "\n空消息!";
}
} private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
mController.Stop();
}
}
}

C#采用Winform实现类似Android的Listener的更多相关文章

  1. WinForm实现类似QQ停靠,显示隐藏过程添加特效效果

    原文:WinForm实现类似QQ停靠,显示隐藏过程添加特效效果 这可能是个老题长谈的问题了,只是在项目中会用到这个效果,所以今天做个记录.大家见了别喷我.在项目中的需求是这样的. 打开程序,在屏幕的右 ...

  2. .net winForm 实现类似qq 弹出新闻

    .net winForm 实现类似qq 弹出新闻   一.背景: echong 之前一直用 公司大牛c语言写的一个弹出托管,前几天写东西的时候发现com调用不是那么好使.而手头上写的这个东西又是.ne ...

  3. c# winform 类似android toast消息功能

    先看下效果: 支持动画,支持声音,支持定时自动关闭 使用方法: var notifycation = new Notification("My Notification", &qu ...

  4. 【转】iOS类似Android上toast效果

    原文网址:http://m.blog.csdn.net/article/details?id=50478737 做过Android开发的人都知道toast,它会在界面上显示一排黑色背景的文字,用于提示 ...

  5. 在Android中动画移动一个View的位置,采用Scroller类实现Android动画之 View移动

    在Android中动画移动一个View的位置,采用Scroller类实现 今天说最近自己遇到的一个问题,就是要用动画效果来移动一个VIew的位置. 这个具体的情况是,需要做一个SlidingMenu的 ...

  6. Android抽屉(SlidingDrawer --类似android通知栏下拉效果)

    Android抽屉(SlidingDrawer)的实现发 - 红黑联盟http://www.2cto.com/kf/201301/182507.html 可动态布局的Android抽屉之基础http: ...

  7. iOS开发的另类神器:libimobiledevice开源包【类似android adb 方便获取iOS设备信息】

    简介 libimobiledevice又称libiphone,是一个开源包,可以让Linux支持连接iPhone/iPod Touch等iOS设备.由于苹果官方并不支持Linux系统,但是Linux上 ...

  8. 采用MQTT协议实现android消息推送(4)选fusesource-mqtt-client为客户端

    1.简介 一个java写的mqtt客户端.项目地址: https://github.com/fusesource/mqtt-client 2.引入fusesource-mqtt-client库 Fil ...

  9. Android 创建Listener监听器形式选择:匿名内部类?外部类?

    说到监听器,第一感觉就是直接写作匿名内部类来用,可是依据单一职责原则,好像又不应该作为匿名内部类来写(由于监听中有时要写较多的逻辑代码),所曾经段时间把有共性的listener单独创建放在glut.l ...

随机推荐

  1. 利用AuthorizeAttribute属性简单避免 MVC 中的跨域攻击

    跨域攻击---自然来路页面和目标页面不在同一个域下,所以直接判断来路域和当前自己的域就可以了. 可以广泛应用于表单提交,ajax调用或者某些不想让用户直接输入网址看到的页面 [csharp] view ...

  2. 第三百零八至三百二十天 how can I 坚持

    十三天..2月4号至2月16号,好快,假期还没开始就结束了.一一回忆下. 2月4号,腊月二十六,最后一天上班,没多大事,好像是玩了一天,东月回家,貌似路上好折腾,晚上D401,和她聊了一路,也聊了好多 ...

  3. 邮件发送服务AWS SES,Mailgun以及SendCloud(转)

    原文:http://www.l4zy.com/posts/aws_ses-mailgun-sendcloud.html 电子邮件这一已经诞生很多年的互联网基础服务并没有随着时间的推移而慢慢消亡,实际上 ...

  4. H3C远程登陆配置

    1.配置本地用户(默认权限 level 1) [H3C]local-user admin [H3C-luser-admin]password cipher [H3C]super password le ...

  5. unigui 导入导出数据

    导入:首先要用TUniFileUpload将文件从客户端上传至服务端,然后完成导入. TUniFileUpload上传文件的演示代码: UniFileUpload1.Execute; UniFileU ...

  6. hdoj 5392 Infoplane in Tina Town

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5392 #include<stdio.h> #include<cstring> ...

  7. mysql 字段操作

    1.添加字段 ALTER TABLE lucky_user ADD COLUMN id_type TINYINT NOT NULL DEFAULT '0' COMMENT "0: 普通用户, ...

  8. SharePoint 2013 自定义翻页显示列表项

    项目需求:自定义开发一个能分页显示列表项的小部件,允许左右翻页,能根据用户权限来显示管理链接等. 效果如下: 技术要求:使用sharepoint rest API 来获取列表项,这样性能高,能够快速响 ...

  9. UI:UIScrollView、UIPageControl

    一.UIScrollView的常⽤用属性 二.UIScrollView的常⽤用代理方法 三.UIPageControl的使⽤用 四.UIPageControl与UIScrollView的结合使⽤用 U ...

  10. Merge into 使用

    在进行SQL语句编写时,我们经常会遇到这样的问题:当存在记录时,就更新(Update),不存在数据时,就插入(Insert),oracle为我们提供了一种解决方法——Merge into ,具体语法如 ...