关于Thread的一个使用,高手绕道
问题描述:在项目中等待一个线程B的执行结果,如果线程B执行完成,则开始执行主线程。
说实话,关于线程,没有太多的研究,这个只是我的一点小小的体会,说出来,有兴趣的同学一起研究下。
step1:创建ScnThread.cs,这是一个执行业务的线程类
public class ScnThread
{
public DispatcherTimer Timer { get; set; }
//是否完成
public bool IsFinished { get; set; }
//是否还在处理中
private bool IsInProcess { get; set; }
public void IsOverThread()
{
IsFinished = false;
IsInProcess = false;
Timer = new DispatcherTimer();
Timer.Interval = TimeSpan.FromMilliseconds(2000);
Timer.Tick += new EventHandler(Timer_Tick);
Timer.Start();
}
private void Timer_Tick(object sender, EventArgs e)
{
if (!IsInProcess)
{
IsInProcess = true;
int i = 0;
while (i < 1000000)//这里是线程中执行业务逻辑的地方,在这里我用循环来代替,表示执行这个业务逻辑需要一点的时间损耗
{
i++;
}
IsFinished = true;
}
}
}
这里我们用一个循环来代替实际中可能需要的业务逻辑。这里我们用了IsFinished 和 IsInProcess来记录这个线程的执行情况,IsInPorcess是来记录是否还在线程执行中,如果还在线程执行中,就不进入Timer_Tick中,从而打断业务逻辑的执行。而IsFinished则是用来表示线程是否完成。
我们在MainPage.xmal.cs中,
public partial class MainPage : UserControl
{
public DispatcherTimer Timer { get; set; }
SLControl.ScnThread t = new ScnThread();
public MainPage()
{
InitializeComponent();
t.IsOverThread();
Timer = new DispatcherTimer();
Timer.Interval = TimeSpan.FromMilliseconds(100);
Timer.Tick += new EventHandler(Timer_Tick);
Timer.Start();
}
private void Timer_Tick(object sender, EventArgs e)
{
label2.Content = System.DateTime.Now.ToString();
if (t.IsFinished)
{
label1.Content = System.DateTime.Now.ToString();
t.Timer.Stop();
Timer.Stop();
}
}
}
在MainPage我们再创建一个线程,用来检测这个线程是否完成。这样就可以在主线程中来检测ScnThread中线程是否执行完成,如果完成,那就更改Label1的Text,并且停止ScnThread中的线程。

浙公网安备 33010602011771号