c#使用多线程的一点点方法

c#使用多线程的一点点方法


看了B站的视频,UP主 dotNet工控上位机在视频 基于c#与台达PLC通信 中用到了多线程、托管访问主界面的控件、线程运行时间等细节技术。在此记录下来备忘。

1、不太可靠的方法

一般写多线程时,需要自定义一个多线程处理程序,把要执行的功能代码写在里面,如xiancheng()。然后在需要开线程的地方利用Task.Run()来创建一个线程,如下代码:

Task.Run(new Action(()=>
{
    XianCheng();
})
//定义线程处理程序
private void XianCheng()
{	int i=0;
	while(true)
	{
	   //具体的线程处理代码 
	   leble1.text =  i.toString(); //会报错	   
	}
}

但是上述方法存在缺点:

  • 主程序退出后,线程仍在运行;
  • 在线程中访问主界面控件会出错。

2、线程访问主界面控件的方法

在子线程要访问主界面的控件时,直接访问会出”线程间操作无效:从不是创建控件的线程访问它“异常。解决此问题,需要用到托管,方法如下:

this.lebel1.Invoke(new Action(()=>
{
	this.label1.Text = i.ToString();
}));

3、线程随主程序结束而退出的方法

在主线程需要开启子线程的位置输入代码

cts = new System.threading.CancellationTokenSource();
Task.Run(new Action(()=>
{
    XianCheng();
}),cts.Token);

///定义线程处理程序
private void XianCheng()
{ while(!cts.IsCancellationRequested)
	{
	   //具体的线程处理代码   	   
	}
}

//在程序结束时,需要调用cts.Cancel();如:
private void Form1_FormClosing(object sender,FormClosingEventArgs e)
{
	cts.Cancel();//线程取消
}

如此基本可以保证主窗体关闭后,线程会正常退出。
但如果线程处理程序较复杂是,主窗体关闭后线程未立即运行完毕,关闭窗体后窗体内的控件已经销毁,线程仍要访问控件,肯定会报错。可以具体代码实现。

4、测试代码运行时间的方法

若需要程序段执行所消耗的时间,可以采用StopWatch实现

//定义变量
private Stopwatch sw = new Stopwatch();

private void XianCheng()
{ while(!cts.IsCancellationRequested)
	{
	    sw.Restart();
	    //具体的线程处理代码   	   
	    this.lblTime.Text = sw.ElapseMilliseconds.ToString() + "ms";
	}
}

自己看视频写的,没有实际操作,要注意鉴别啊!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值