欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-22 11:22:04
本文实例讲述了c#采用winform实现类似android下listener的方法。非常实用的一个技巧。具体实现方法如下: 首先是一个icallbacklistener接...

本文实例讲述了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#程序设计有一定的帮助。

上一篇:

下一篇: