2个线程同时做同一个操作,不影响主线程的其他操作 感觉好像点击Check1Button后没有启线程呢,要是启线程的话不会卡主UI线程的 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 代码如下: /// <summary> /// 定义一个队列,用于记录用户创建的线程 /// 以便在窗体关闭的时候关闭所有用于创建的线程 /// </summary> private List<Thread> ChaosThreadList; /// <summary> /// 窗体的初始化函数,初始化线程队列ChaosThreadList /// </summary> public Form1() { InitializeComponent(); ChaosThreadList = new List<Thread>(); } static bool IsOk = false; static int arrIndex = 0; static string SpiNum = ""; static ushort maxLen; static string tempStr = "Usable flash size: "; static string tempStr2 = "Recongnized AMD-compatible device on BC5-MM (elv), "; //这个类是我check硬件flash的信息的,初始化在这里 Class_Csr csr = new Class_Csr(out maxLen); bool click; private volatile int result1= 1; private volatile int result2 = 1; private volatile int result3 = 1; private volatile int result4 = 1; /// <summary> /// 定义一个代理 /// </summary> private delegate void myDelegate3(); /// <summary> /// 定义一个函数,专门chck FLASH info; /// </summary> private void Delegate_3_Run() { if (this.InvokeRequired==false)//如果调用该函数的线程和窗体控件位于同一个线程内 { if (result3 == Class_Csr.TFL_OK) { label1.Text = "Verify Passed"; } else { label1.Text = "Verify Fail"; } btn_Stop_progress.Enabled = true; btn_Download.Enabled = true; btn_Erase.Enabled = true; btn_Download2.Enabled = true; btn_Verify_1.Enabled = true; label1.Refresh(); } else { //check Flash 信息的函数 result3 = csr.CSRflmVerifys("USB SPI (228077)"); myDelegate3 md3 = new myDelegate3(Delegate_3_Run); this.Invoke(md3); } } private void Thread_DisplayMSG3() { Delegate_3_Run(); } /// <summary> /// 定义一个代理 /// </summary> private delegate void myDelegate4(); /// <summary> /// 定义一个函数,专门chck FLASH info; /// </summary> private void Delegate_4_Run() { if (this.InvokeRequired==false)//如果调用该函数的线程和窗体控件位于同一个线程内 { if (result4 == Class_Csr.TFL_OK) { label5.Text = "Verify Passed"; } else { label5.Text = "Verify Fail"; } btn_Stop_progress.Enabled = true; btn_Download.Enabled = true; btn_Erase.Enabled = true; btn_Download2.Enabled = true; btn_Verify_2.Enabled = true; label5.Refresh(); } else { //check Flash 信息的函数 result4 = csr.CSRflmVerifys("USB SPI (208811)"); myDelegate4 md4 = new myDelegate3(Delegate_4_Run); this.Invoke(md4); } } private void Thread_DisplayMSG4() { Delegate_4_Run(); } private void btn_Verify_1_Click(object sender, EventArgs e) { if (txbox_Path_FW.Text == "") { MessageBox.Show("Invilid File!"); label1.Text = "File open failed."; label1.Refresh(); } else { label1.Text = ""; btn_Stop_progress.Enabled = false; btn_Download2.Enabled = false; btn_Download.Enabled = false; btn_Erase.Enabled = false; btn_Verify_1.Enabled = false; int j = csr.CSRflmInt_SPI(cmbobox_Port_Sel.SelectedItem.ToString()); if (j == Class_Csr.TFL_OK) { csr.CSRflmReadProgramFiles(); //创建一个新的线程 Thread CsrTh3 = new Thread(Thread_DisplayMSG3); //将新建的线程加入到自定义线程队列中,以便在窗体结束时关闭所有的线程 ChaosThreadList.Add(CsrTh3);//ChaosThreadList CsrTh3.IsBackground = true; //开启线程 CsrTh3.Start(); } } } private void btn_Verify_2_Click(object sender, EventArgs e) { if (txbox_Path_FW.Text == "") { MessageBox.Show("Invilid File!"); label1.Text = "File open failed."; label1.Refresh(); } else { label5.Text = ""; label5.Refresh(); btn_Stop_progress.Enabled = false; btn_Download2.Enabled = false; btn_Download.Enabled = false; btn_Erase.Enabled = false; btn_Verify_2.Enabled = false; string s = cmbobox_Port_Sel2.SelectedItem.ToString(); int j = csr.CSRflmInt_SPI(s); if (j == Class_Csr.TFL_OK) { csr.CSRflmReadProgramFiles(); //创建一个新的线程 Thread CsrTh4 = new Thread(Thread_DisplayMSG4); //将新建的线程加入到自定义线程队列中,以便在窗体结束时关闭所有的线程 ChaosThreadList.Add(CsrTh4); CsrTh4.IsBackground = true; //开启线程 CsrTh4.Start(); } } } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { csr.CSRflClose(); if (ChaosThreadList.Count > 0) { //编列自定义队列,将所有线程终止 foreach (Thread CsrTh in ChaosThreadList) { CsrTh.Abort(); } } } //check Flash 信息的函数 result4 = csr.CSRflmVerifys("USB SPI (208811)"); myDelegate4 md4 = new myDelegate3(Delegate_4_Run); this.Invoke(md4);在这里把thisInovke你可以改成md4.Invoke或者另起一线程,因为你this.Invoke会调用UI线程 能在线程里面在create 一个 线程? 即使不创建新的线程,继续使用原来的线程,也不能使用this.Invoke,这样的话,在执行时,他会使用this的创建线程(UI线程)去执行你的功能代码,这样会导致界面卡死 VS2005怎么改变编码啊 C# 怎么避免录入文本的地方输入引号之类特殊符号的字符引起bug 为沈默1会变成01? 转换类型 Enum.Pase 如何利用Asp.net(C#)来读取word文档?详情见内! 我想实现通过浏览器对局域网内共享文件的访问 求助!!!! 如何在c#编辑环境中设置行号呢?答对马上给分 关于EventLog日志权限的问题。 求解一超级疑难硬盘启动问题,!!!!!! c# 打印固定格式的针式打印机 求救!!! 请大家帮我解决一个entity framework4.1 for Oracle的问题
/// <summary>
/// 定义一个队列,用于记录用户创建的线程
/// 以便在窗体关闭的时候关闭所有用于创建的线程
/// </summary>
private List<Thread> ChaosThreadList;
/// <summary>
/// 窗体的初始化函数,初始化线程队列ChaosThreadList
/// </summary>
public Form1()
{
InitializeComponent();
ChaosThreadList = new List<Thread>();
}
static bool IsOk = false;
static int arrIndex = 0;
static string SpiNum = "";
static ushort maxLen;
static string tempStr = "Usable flash size: ";
static string tempStr2 = "Recongnized AMD-compatible device on BC5-MM (elv), ";
//这个类是我check硬件flash的信息的,初始化在这里
Class_Csr csr = new Class_Csr(out maxLen);
bool click;
private volatile int result1= 1;
private volatile int result2 = 1;
private volatile int result3 = 1;
private volatile int result4 = 1;
/// <summary>
/// 定义一个代理
/// </summary>
private delegate void myDelegate3();
/// <summary>
/// 定义一个函数,专门chck FLASH info;
/// </summary>
private void Delegate_3_Run()
{
if (this.InvokeRequired==false)//如果调用该函数的线程和窗体控件位于同一个线程内
{
if (result3 == Class_Csr.TFL_OK)
{
label1.Text = "Verify Passed";
}
else
{
label1.Text = "Verify Fail";
}
btn_Stop_progress.Enabled = true;
btn_Download.Enabled = true;
btn_Erase.Enabled = true;
btn_Download2.Enabled = true;
btn_Verify_1.Enabled = true;
label1.Refresh();
}
else
{
//check Flash 信息的函数
result3 = csr.CSRflmVerifys("USB SPI (228077)");
myDelegate3 md3 = new myDelegate3(Delegate_3_Run);
this.Invoke(md3);
}
} private void Thread_DisplayMSG3()
{
Delegate_3_Run();
}
/// <summary>
/// 定义一个代理
/// </summary>
private delegate void myDelegate4();
/// <summary>
/// 定义一个函数,专门chck FLASH info;
/// </summary>
private void Delegate_4_Run()
{
if (this.InvokeRequired==false)//如果调用该函数的线程和窗体控件位于同一个线程内
{
if (result4 == Class_Csr.TFL_OK)
{
label5.Text = "Verify Passed";
}
else
{
label5.Text = "Verify Fail";
}
btn_Stop_progress.Enabled = true;
btn_Download.Enabled = true;
btn_Erase.Enabled = true;
btn_Download2.Enabled = true;
btn_Verify_2.Enabled = true;
label5.Refresh();
}
else
{
//check Flash 信息的函数
result4 = csr.CSRflmVerifys("USB SPI (208811)");
myDelegate4 md4 = new myDelegate3(Delegate_4_Run);
this.Invoke(md4);
}
} private void Thread_DisplayMSG4()
{
Delegate_4_Run();
} private void btn_Verify_1_Click(object sender, EventArgs e)
{
if (txbox_Path_FW.Text == "")
{
MessageBox.Show("Invilid File!");
label1.Text = "File open failed.";
label1.Refresh();
}
else
{
label1.Text = "";
btn_Stop_progress.Enabled = false;
btn_Download2.Enabled = false;
btn_Download.Enabled = false;
btn_Erase.Enabled = false;
btn_Verify_1.Enabled = false;
int j = csr.CSRflmInt_SPI(cmbobox_Port_Sel.SelectedItem.ToString());
if (j == Class_Csr.TFL_OK)
{
csr.CSRflmReadProgramFiles();
//创建一个新的线程
Thread CsrTh3 = new Thread(Thread_DisplayMSG3);
//将新建的线程加入到自定义线程队列中,以便在窗体结束时关闭所有的线程
ChaosThreadList.Add(CsrTh3);//ChaosThreadList
CsrTh3.IsBackground = true;
//开启线程
CsrTh3.Start();
}
}
} private void btn_Verify_2_Click(object sender, EventArgs e)
{
if (txbox_Path_FW.Text == "")
{
MessageBox.Show("Invilid File!");
label1.Text = "File open failed.";
label1.Refresh();
}
else
{
label5.Text = "";
label5.Refresh();
btn_Stop_progress.Enabled = false;
btn_Download2.Enabled = false;
btn_Download.Enabled = false;
btn_Erase.Enabled = false;
btn_Verify_2.Enabled = false;
string s = cmbobox_Port_Sel2.SelectedItem.ToString();
int j = csr.CSRflmInt_SPI(s);
if (j == Class_Csr.TFL_OK)
{
csr.CSRflmReadProgramFiles();
//创建一个新的线程
Thread CsrTh4 = new Thread(Thread_DisplayMSG4);
//将新建的线程加入到自定义线程队列中,以便在窗体结束时关闭所有的线程
ChaosThreadList.Add(CsrTh4);
CsrTh4.IsBackground = true;
//开启线程
CsrTh4.Start();
}
}
} private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
csr.CSRflClose();
if (ChaosThreadList.Count > 0)
{
//编列自定义队列,将所有线程终止
foreach (Thread CsrTh in ChaosThreadList)
{
CsrTh.Abort();
}
}
}
result4 = csr.CSRflmVerifys("USB SPI (208811)");
myDelegate4 md4 = new myDelegate3(Delegate_4_Run);
this.Invoke(md4);在这里把thisInovke你可以改成md4.Invoke或者另起一线程,因为你this.Invoke会调用UI线程