您的位置:首页 > 编程语言 > C#

c# Thread 线程

2017-02-27 18:16 513 查看
Thread 类

线程

Thread.IsBackground 属性

获取或设置一个值,该值指示某个线程是否为后台线程。

true为后台线程,false为前台线程,默认为false.

注意前台线程和后台线程的区别:

例如在主线程下new了一个新的线程,此线程默认为前台线程,当关闭窗口结束主线程的时候,此线程还未结束,因此在任务管理器中还是可以看到当前的程序进程。

如果把此线程IsBackground = true,则此线程为后台线程,当主线程结束的时候此线程也会结束。

总结:

前台线程使进程保持运行,直到它的循环体结束为止,才会终止当前程序的进程。

后台线程不会阻止进程的终止,当前程序的进程结束了次线程就结束了。

应用程序进程的存亡由前台线程决定而于后台线程无关。

public static void Sleep(
int millisecondsTimeout

)

挂起线程的毫秒数。

private void Init()
{
Thread thread1 = new Thread(DoWork);
thread1.Start();
}

private void DoWork()
{
for (int i = 0; i < 3; i++)
{
Console.WriteLine("DoWork...");
Thread.Sleep(100);
}
}


在wpf程序中,子线程不能直接访问mxml中的控件,需要调用Dispatcher.Invoke 方法。

例如:Label  Button    lbl.Dispatcher.Invoke();

Dispatcher.Invoke 方法 (Action)

Dispatcher.CheckAccess 方法 ()

确定调用线程是否是与此Dispatcher相关联的线程。

在mxml中有个Label控件Name为lb

<Label Name="lb" Content="Label"/>

在对应的cs脚本中的代码

private void Init()
{
Thread thread = new Thread(DoWork);
thread.Start();
}

private void DoWork()
{
lb.Content = "Hello";//会报错  引发InvalidOperationException异常
}


正确的使用方法如下:

private void Init()
{
Thread thread = new Thread(DoWork);
thread.Start();
}

private void DoWork()
{
if(lb.Dispatcher.CheckAccess())
{
//可以直接调用
lb.Content = "Hello";
}
else
{
//不能直接调用需要用Dispatch.Invoke
lb.Dispatcher.Invoke(UpdateLabelMsg);
}
}

private void UpdateLabelMsg()
{
lb.Content = "Hello";
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# 线程