线程、多线程、防止线程重入

一个程序运行起来,都会生成一个进程。每个进程都有一个默认的进程。这个进程叫做主线程,也叫UI线程。

主线程之外,另外的线程都称为子线程。任何在程序里new的线程,都是子线程。

任何一个线程都会默认为前台线程。可以主动设置默认线程。//th.IsBackground = true;

后台线程与前台线程的区别:一个进程只有在所有的前台线程都结束,整个进程才会关闭。如果前台线程都结束了,假如后台线 程还在执行,那么所有的后台线程会被立刻结束。

创建一个线程,可以不带参数,也可以带参数。带参数时,是在.start()的括号里面调用的。

线程在用完了以后,不会立即消失,而是会存到线程池中。

 

ThreadPool线程池中有两个重载的静态方法可以直接启动工作者线程:

  •   ThreadPool.QueueUserWorkItem(waitCallback);
  •   ThreadPool.QueueUserWorkItem(waitCallback,Object);

  先把WaitCallback委托指向一个带有Object参数的无返回值方法,再使用ThreadPool.QueueUserWorkItem(WaitCallback)就可以一步启动此方法,此时异步方法的参数被视为null

能够暂时将跨线程问题跳过:

Control.CheckForIllegalCrossThreadCalls = false;

线程的常用成员:

1.Thread.CurrentThread;//获取当前的工作进程。

2.每个线程都有一个唯一的id,这个id是有操作系统维护的,id的作用就是为了操作系统来调度这些线程 

3.Thread.Sleep(3000);//暂停,让当前线程挂起,括号内的单位是毫秒,3000为3秒

4.Thread.Abort();//终止线程

线程重入:两个线程同时进行,一些共同的数据可能窜用。

防止线程重入:加锁。选中代码,然后右键,添加外侧代码,找到lock。

锁要生成为全局的,用this。lock(this),一般不会出错 

 

使用多线程:

using System.Threading;//引用进程

 
Thread th = new Thread(Loop);//创建一个子线程。//Thread()的括号内是一个委托
th.IsBackground = true;//主动设置默认线程
th.Start();//运行
  th.start(233)//带参数,传参
//将当前进程的id输出搭配textBox1中
this.textBox1.Text = Thread.CurrentThread.ManagedThreadId.ToString(); 
Thread.Sleep(3000);//暂停,暂时挂起,括号内的单位是毫秒,3000为3秒
  MessageBox.Show("三秒完了");//输出一个提示框
private void Loop()
        {
            for (int i = 0; i < 999999999; i++)
            {


            }
            MessageBox.Show("做完了");
        }

private static void GetNumber(object num)//带参数的委托
 {

 }
 private static void GetNumber2(object p)//带参数的委托,参数类型不为object的
 {
    Person p = p as person;
 }

 

 

 

 

 

没有更多推荐了,返回首页