C#如何控制管理线程,c#线程操作

这篇文章主要介绍了C#如何控制管理线程,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下方案一:调用线程控制方法.启动:Thread.Start();停止:Threa。

这篇文章主要介绍了C#如何控制管理线程,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

具体内容如下

方案一:

调用线程控制方法.启动:Thread.Start();停止:Thread.Abort();暂停:Thread.Suspend();继续:Thread.Resume();

privatevoidbtn_Start_Cpck(objectsender,EventArgse)
{
mThread.Start();//开始
}

privatevoidbtn_Stop_Cpck(objectsender,EventArgse)
{
mThread.Abort();//终止
}

privatevoidbtn_Suspend_Cpck(objectsender,EventArgse)
{
mThread.Suspend();//暂停
}

privatevoidbtn_Resume_Cpck(objectsender,EventArgse)
{
mThread.Resume();//继续
}

线程定义为:

mThread=newThread(()=>
{
try
{
for(intj=0;j<20;j++)
{
intvSum=0;
this.textBox1.Text+="--->";
for(inti=0;i<100000000;i++)
{
if(i%2==0)
{
vSum+=i;
}
else
{
vSum-=i;
}
}
this.textBox1.Text+=string.Format("{0}=>vSum={1}\r\n",DateTime.Now.ToString(),vSum);
Thread.Sleep(1000);
}
}
catch(ThreadAbortExceptionex)
{
Console.WriteLine("ThreadAbortException:{0}",ex.Message);
}
});

值得注意的是: 通过 Thread.Abort() 停下来的线程(或自行运行结束的线程),都无法直接通过 Thread.Start() 方法再次启动,必须重新创建一个线程启动。

所以,“开始按钮”事件应为:

privatevoidbtn_Start_Cpck(objectsender,EventArgse)
{
//定义线程
mThread=newThread(()=>//Lambda表达式
{
try
{
for(intj=0;j<20;j++)
{
intvSum=0;
this.textBox1.Text+="--->";
for(inti=0;i<100000000;i++)
{
if(i%2==0)
{
vSum+=i;
}
else
{
vSum-=i;
}
}
this.textBox1.Text+=string.Format("{0}=>vSum={1}\r\n",DateTime.Now.ToString(),vSum);
Thread.Sleep(1000);
}
}
catch(ThreadAbortExceptionex)
{
Console.WriteLine("ThreadAbortException:{0}",ex.Message);
}
});

mThread.Start();//开始
}

此外,对于 Thread.Suspend() 和 Thread.Resume() 方法,微软已经将其标记为过时:

Thread.Suspend has been deprecated. Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources. http://go.microsoft.com/fwpnk/?pnkid=14202(Thread.Suspend 已被否决。请使用系统中的其他类线程,如监视器、互斥体、事件和信号量,以同步线程或保护资源。http://go.microsoft.com/fwpnk/?pnkid=14202)

因为,无法判断当前挂起线程时它正在执行什么代码。如果在安全权限评估期间挂起持有锁的线程,则 AppDoamin 中的其它线程可能被阻止。如果在线程正执行构造函数时挂起它,则 AppDomain 中尝试使用该类的其它线程将被阻止。这样容易发生死锁。

方案二:

在 线程运行过程中 适当的位置(如某个完整的功能/命令后)判断是否要继续线程,再决定线程的命运。

1.定义一个全局变量:

intmTdFlag=0;//1:正常运行;2:暂停;3:停止

2. 定义一个判断方法:

boolWaitForContinue()
{
if(this.mTdFlag==3)
{
returnfalse;//返回false,线程停止
}
elseif(this.mTdFlag==2)
{
while(mTdFlag!=1)
{
Thread.Sleep(200);//假暂停;停顿时间越短,越灵敏
if(this.mTdFlag==3)
{
returnfalse;//返回false,线程停止
}
}
}
returntrue;//返回true,线程继续
}

3.修改 控制命令 事件:

privatevoidbtn_Stop_Cpck(objectsender,EventArgse)
{
this.mTdFlag=3;
//mThread.Abort();//终止
}

privatevoidbtn_Suspend_Cpck(objectsender,EventArgse)
{
this.mTdFlag=2;
//mThread.Suspend();//暂停
}

privatevoidbtn_Resume_Cpck(objectsender,EventArgse)
{
this.mTdFlag=1;
//mThread.Resume();//继续
}

4.在线程运行过程中适当的位置,判断线程是否继续

mThread=newThread(()=>
{
try
{
for(intj=0;j<20;j++)
{
intvSum=0;
this.textBox1.Text+="--->";
for(inti=0;i<100000000;i++)
{
if(i%2==0)
{
vSum+=i;
}
else
{
vSum-=i;
}
if(i%10000000==0)
{
this.textBox1.Text+=".";
}
if(!WaitForContinue())//返回false则,停止
{
break;
//return;
}
}
this.textBox1.Text+=string.Format("{0}=>vSum={1}\r\n",DateTime.Now.ToString(),vSum);
if(!WaitForContinue())//返回false则,停止
{
break;
//return;
}
Thread.Sleep(1000);
}
}
catch(ThreadAbortExceptionex)
{
Console.WriteLine("ThreadAbortException:{0}",ex.Message);
this.textBox1.Text+=ex.Message+"...";
}
finally
{
this.textBox1.Text+="线程已结束";
}
});

在窗体中,解决跨线程访问问题:在窗体构造函数中添加代码: Control.CheckForIllegalCrossThreadCalls = false;

感谢你能够认真阅读完这篇文章,希望小编分享的“C#如何控制管理线程”这篇文章对大家有帮助,同时也希望大家多多支持编程,关注编程行业资讯频道,更多相关知识等着你来学习!

C#如何控制管理线程文章到此结束,字数约3994字,希望可以帮助到大家。屹东网往后会继续推荐C#如何控制管理线程相关内容。