国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

C#采用Winform實現類似Android的Listener

2020-01-24 02:29:41
字體:
來源:轉載
供稿:網友

本文實例講述了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(3000);        if (mFlagDoWork)        {          // 執行相應的處理          // 具體處理的工作就在這里          ActiveOnCallBack();        }        Thread.Sleep(3000);        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#程序設計有一定的幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 盐山县| 中江县| 长宁县| 琼海市| 景东| 莱州市| 南京市| 贡觉县| 城市| 呼伦贝尔市| 章丘市| 新密市| 平湖市| 平遥县| 东丽区| 洪湖市| 通渭县| 民丰县| 博罗县| 仁寿县| 兴安盟| 广元市| 镇原县| 汾阳市| 从化市| 夏河县| 察哈| 承德县| 霍州市| 精河县| 平安县| 当阳市| 杭锦后旗| 大兴区| 师宗县| 虹口区| 临武县| 华容县| 庆城县| 德保县| 安阳市|