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";
}
}
自己看视频写的,没有实际操作,要注意鉴别啊!