博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于接口和队列的线程操作UI方式
阅读量:5876 次
发布时间:2019-06-19

本文共 2290 字,大约阅读时间需要 7 分钟。

    在实际开发应用中,非UI线程操作UI是普遍存在的,在.net下一般是通过Control.Invoke的方法来进行操作,但到处都是Control.Invoke代码维护可是一件麻烦的事情。以下通过接口和队列来规范非UI线程操UI的实现。

   既然要规范处理那接口是个不错的选择,以下定义一个简单的执行接口

public interface IInvokeItem    {        void Execute();    }

  以下是扩展一个简单的操作类封装

class ControlInvoke
: IInvokeItem { public ControlInvoke(CONTROL control, DATA data, Action
action) { mControl = control; mData = data; mAction = action; } private CONTROL mControl; private DATA mData; private Action
mAction; public void Execute() { mAction(mControl, mData); } }

  规则定好了,那接下来要做的事情就是写一个简单的队列处理。

public class Dispatch    {        static Dispatch()        {            Instance = new Dispatch();        }        public void Add
(CONTROL control, DATA data, Action
action) { ControlInvoke
item = new ControlInvoke
(control, data, action); Add(item); } private Queue
mQueues = new Queue
(); public static Dispatch Instance { get; set; } public void Add(IInvokeItem item) { lock (this) { mQueues.Enqueue(item); } } public void Execite() { lock (this) { while (mQueues.Count > 0) { mQueues.Dequeue().Execute(); } } } }

  一个简单的调用规则就完成,接下来就是如果在winform下面用了;首先可以在界面定义一个timer,可以指定时间内执行Dispatch的工作。

private void timer1_Tick(object sender, EventArgs e)        {            ThreadInvoke.Dispatch.Instance.Execite();         }

  当需要在线程中操作UI只需要向ThreadInvoke.Dispatch添加item即可,对于它的执行是完全不用关心的。以下是起一个线程不停地向一个文本框添加一个GUID值

private void cmdTest_Click(object sender, EventArgs e)        {            System.Threading.ThreadPool.QueueUserWorkItem(OnTest);        }        private void OnTest(object state)        {            while (true)            {                ThreadInvoke.Dispatch.Instance.Add
( richTextBox1, Guid.NewGuid(), (c, d) => { richTextBox1.AppendText(d.ToString("N")); richTextBox1.AppendText("\r\n"); }); System.Threading.Thread.Sleep(10); } }

 这样一个不使用Control.Invoke来实现非UI线程操作UI的方法就完成了.至于灵活性来说那就看你如何发挥IInvokeItem了:)

转载地址:http://kfzix.baihongyu.com/

你可能感兴趣的文章
Xcode全局替换内容,一键Replace
查看>>
1000 加密算法
查看>>
exif_imagetype() 函数在linux下的php中不存在
查看>>
Ruby的case语句
查看>>
Linux的链接文件-ln命令
查看>>
maven的tomcat插件如何进行debug调试
查看>>
table表头固定
查看>>
截取字符串中两个字符串中的字符串
查看>>
spring xml properties split with comma for list
查看>>
判断点是否在三角形内
查看>>
Android实战简易教程-第二十三枪(基于Baas的用户注冊验证username是否反复功能!)...
查看>>
在odl中怎样实现rpc
查看>>
leetcode 110 Balanced Binary Tree
查看>>
python活用isdigit方法显示系统进程
查看>>
项目开发总结
查看>>
知行合一
查看>>
jmeter插件之jsonpath提取响应结果和做断言
查看>>
发布支持多线程的PowerShell模块 —— MultiThreadTaskRunner
查看>>
Ubuntu ctrl+alt会导致窗口还原的问题
查看>>
第四十期百度技术沙龙笔记整理
查看>>