java 线程 invoke_C# this.Invoke()与Delegate.Invoke()区别-------使用多线程循环执行(定时执行)数据处理功能...

--所在的宿主线程体不同

this.Invoke()是在当前UI(或对象)线程的基础上的执行的委托

Delegate.Invoke()是在UI线程之外的新线程基础上执行的委托(例如下边代码的myThread)

--参数不同

this.Invoke(Delegate)--需要传递一个委托的对象实例

Delegate.Invoke();--不需要任何参数,执行的是当前委托绑定的方法

我们看下边代码

private Delegate_LED dgate = null;//委托

private Thread myThread;//线程

///

///构造函数

///

private QueueLED()

{

myThread = new Thread(new ThreadStart(StartLED));//开启线程

myThread.IsBackground = true;//后台运行,保证主程序退出时,此线程也会退出

myThread.Start();//线程开始

}

private void doFunction()

{

//your code

//循环或者定时处理的或者获取的数据代码

//Thread.Sleep(1000)

}

//线程开始数据处理方法//------(一)使用this.Invoke()的代码段-------

private void StartLED()

{

try

{

while (true)

{

if(this.InvokeRequired)

{

dgate=doFunction;//委托绑定方法,doFunction是你要处理的数据方法

this.Invoke(dgate)//同步执行委托

}

else

{

doFunction();

}

Thread.Sleep(100);//循环Sleep

}

}

catch (Exception ex)

{

LogRecord.RecordLog(ex.Message + ex.Source + ex.InnerException");//异常日志记录

}

}

//------(二)使用Delegate.Invoke()的代码段-------

private void StartLED()

{

try

{

while (true)

{

dgate = UpdateFun;

dgate.Invoke();

Thread.Sleep(100);

}

}

catch (Exception ex)

{

LogRecord.RecordLog(ex.Message + ex.Source + ex.InnerException");//异常日志记录

}

}

以上代码段都可以在不影响主程序运行的基础开辟子线程的数据处理,防止软件界面“假死”情况

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值