版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
多线程:
考虑到多线程是因为在做汉内塔动画时,当移动的数量变多或者移动时间比较长时,会出现窗体卡死的现象,直到移动结束才会显示出来。
查资料发现与线程有关(或者说多线程可以解决)。
1、线程创建
//创建线程
Thread thread = new Thread( new ParameterizedThreadStart( AnimateDiskMove ) );
//启动线程
thread.Start();
//强制关闭线程
thread.Abort();
2、需要传值进入线程的方法时
例如:子线程调用的方法为void AddNumber (int na , int nb)
提供一种方法
申明时使用 ParameterizedThreadStart
,如下
Thread thread = new Thread( new ParameterizedThreadStart( AnimateMovement ) );
这样调用时候,可以用
int y= 10;
int[] xyArray = new int[] { x,y};
thread.Start( xyArray );
定义方法时,传入为 object类型
void AddNumber ( object coord)
{
}
3、当子线程要操作Form窗体的空间时
在void Form1_Load( object sender, EventArgs e )
下加入以下代码,也就是不检查是否跨线程调用窗体
// other thread can control Forms
Control.CheckForIllegalCrossThreadCalls = false;
4、当要等待子线程执行完毕,才继续执行主线程时。
首先在方法体外定义一个 lock
object locker = new object();
然后在调用子线程的Start( )
方法后加入如下代码:
其中 finishcount
表示子线程执行次数,会写在子线程执行的方法最后;
_ThreadCount
表示主线程要等待几次子线程
lock (locker)
{
while (finishcount != _ThreadCount)
{
Monitor.Wait(locker);//等待
}
}
最后在子线程的方法中最后加入:
lock (locker)
{
finishcount++;
Monitor.Pulse(locker); //完成,通知等待队列,告知已完,执行下一个。
}
注意:若要多次调用,则需要将finishcount
清零。
完整代码如下:
using System.Threading;
namespace ThreadStudy
{
class StopAllSubThread
{
int _ThreadCount = 5;
int finishcount = 0;
object locker = new object();
public void Main()
{
for (int i = 0; i < _ThreadCount; i++)
{
Thread trd = new Thread(new ParameterizedThreadStart(ThreadMethod));
trd.Start(i);
}
lock (locker)
{
while (finishcount != _ThreadCount)
{
Monitor.Wait(locker);//等待
}
}
Console.WriteLine("Thread Finished!");
}
private void ThreadMethod(object obj)
{
//模拟执行程序
Thread.Sleep(3000);
Console.WriteLine("Thread execute at {0}", obj.ToString());
lock (locker)
{
finishcount++;
Monitor.Pulse(locker); //完成,通知等待队列,告知已完,执行下一个。
}
}
}
}
4、线程被终止(Abort()
)了无法再次启动(Start()
)
可以先挂起suspend,再resume()