• C#采用Winform实现类似Android的Listener


    本文实例讲述了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 += "
    当前的处理:" + pText;
          }
          else
          {
            textBox1.Text += "
    空消息!";
          }
        }
     
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
          mController.Stop();
        }
      }
    }
  • 相关阅读:
    IP和java.net.InetAddress类的使用
    Redis(五):几个常用概念
    Redis(一):概述
    mongodb写入策略(WriteConcern)
    mongodb配置详解
    MongoDB优化
    Python 多进程异常处理
    Python多进程编程-进程间协作(Queue、Lock、Semaphore、Event、Pipe)
    Mongodb 性能测试
    把 MongoDB 当成是纯内存数据库来使用(Redis 风格)
  • 原文地址:https://www.cnblogs.com/rinack/p/4260191.html
Copyright © 2020-2023  润新知