回调(委托)与线程
1.线程间的工作是相互独立的;
2.CheckForIllegalThreadCalls=False; 不检查线程间的错误/冲突,在实际开发中禁止使用,这会导致线程不安全;
3.流程:
为了使窗体应用程序运行更加流程,最好使用非阻塞(异步)的方式;
如下例:
需要使主窗体运行progressBar2的同时,运行progressBar1,且鼠标拖动时不影响progressBar1的运行;
那么,先定义一个委托(回调),并对其声明,实例化,接着创建一个线程,开启线程,并在该线程中调用委托完成被委托方法的功能。
效果图:
运行程序后

点击start按钮后

鼠标拖动后

代码如下:
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 System.Threading;
namespace 线程
{
public partial class frmXC : Form
{
delegate void SetProgressbarValueDelegate(int value); //定义回调(委托)
SetProgressbarValueDelegate setProgressbarValue; //声明回调(委托)
public frmXC()
{
InitializeComponent();
}
private void btn_Start_Click(object sender, EventArgs e)
{
setProgressbarValue = new SetProgressbarValueDelegate(setpgb1Value);//实例化委托
Thread pgb1Thread = new Thread(progressBar1); //创建一个新的线程
pgb1Thread.Start(); //线程开始
for(int i=0;i<100;i++) //主线程有进度条1
{
Application.DoEvents(); //交出控制权,以便响应事件,消除假死现象
Thread.Sleep(50); //延时50ms
pgb_bar2.Value=i; //设置进度条2的值
}
}
private void progressBar1() //设置进度条1的值的线程
{
for (int i = 0; i < 100;i++ ) //循环设置
{
Thread.Sleep(50); //50ms
pgb_bar1.Invoke(setProgressbarValue, i); //通过回调(委托)设置进度条1的值
}
}
private void setpgb1Value(int value) //设置进度条2值被委托的方法
{
pgb_bar1.Value=value;
}
}
}

浙公网安备 33010602011771号