本文实例讲述了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. django1.77+mod_wsgi+python2.79+apache2.24 在阿里云centos部署攻略

    心平气和的记录一下今天 踩的坑以防万一 以后还踩 首先我今天的平台是在 阿里云上的一台纯净版的 centos6.5 64位主机上进行的 首先装python2.7 去官网下载python2.7安装包 然 ...

  2. 第二百二十五 how can I 坚持

    今天感觉好累啊,心累,上班连开两个会.事情乱七八糟,接二连三. 住的这噪音还那么大. 哎. 睡觉吧.

  3. delphi 2010 导出sql server 数据到DBF乱码问题

    近日,由于业务需要导出sql server 数据到DBF文件,要查询多表记录,并适当处理后生成导出DBF文件,系统使用delphi2010平台开发. 首先按要求在VFP里创建DBF表,字段数有240个 ...

  4. oracle学习 六 删除表空间,数据文件的语句以及导入导出dmp文件的方法(持续更新中)

    要想删除表空间就要先删除数据文件 例如这个例子 CREATE TABLESPACE STHSGIMGDB_SPACE11 DATAFILE 'D:\ORACLEDATABASE\JinHuaDataB ...

  5. Thinkphp模板怎么使用自定义函数

    内置模板引擎支持对模板变量使用函数,并支持多个函数同时使用. 注意:自定义函数要放在项目应用目录/common/common.php中. 这里是关键. 模板变量的函数调用格式:{$varname|fu ...

  6. C# 与 C++ 数据类型对照

    C++            C#=====================================WORD            ushortDWORD            uintUCH ...

  7. ASP.NET MVC 修改视图的默认路径(MVC2,MVC3)

    ASP.NET MVC2 修改视图的默认路径 步骤:1.编写继承自WebFormViewEngine的类,重写视图路径 2.在Application_Start()中添加语句: ViewEngines ...

  8. JavaScript 跨域:谈谈跨域之 JSONP

    在 Web 开发中,后台开发人员应该会通常遇到这个问题:跨域,而使用 JSONP 就是其中解决办法之一,当然,还有其它解决方法,比如:window.name.window.postMessage.CO ...

  9. spring 切面 前置后置通知 环绕通知demo

    环绕通知: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http:// ...

  10. cocos2d-x 用浏览器打开网页

    转自:http://www.xuebuyuan.com/1396292.html,http://www.cocoachina.com/bbs/read.php?tid=88589 First!! 源代 ...