• 多线程总结


    一,为什么要用多线程?

    一个进程至少有一个线程,使用多线程可以让一个进程同时处理多件事情。

    多线程可用在以下场合:

    1.      网络socket通信;

    2.      执行占用大量时间的操作;

    3.      用户界面响应用户操作,由后台来执行任务等。

    二,无参多线程的使用

    Thread thread = new Thread(new ThreadStart(SayHello));

         thread.Start();

    1.      new一个线程时需要传委托ThreadStart,此委托无返回值无参数;

    2.      Start()方法是告诉操作系统此线程已准备就绪,而并非真的开始执行,具体什么时候执行是靠操作系统来分配的。

    三,有参多线程的使用

    Thread thread = new Thread(new ParameterizedThreadStart(SayHi));

         thread.Start("Tom");

    1.      new一个线程时需要传委托ParameterizedThreadStart,无返回值,参数类型为object

    2.      要传递的参数用Start()方法传进去。

    四,怎么样传递多个参数?

    由于ParameterizedThreadStart委托传递参数类型为object,所以可以通过传递数组或泛型集合等来传递多个参数,如:

    List<string>list = new List<string>();

         list.Add("Tom");

         list.Add("Jony");

         list.Add("HanMeiMei");

        Thread thread = newThread(new ParameterizedThreadStart(SayHi));

         thread.Start(list);

    五,线程的常用属性与方法

    1.      当前线程:

    Thread.CurrentThread

    2.       线程ID,线程的唯一标识:

    thread.ManagedThreadId

     

    3.      线程休眠,静态方法,单位为ms

    Thread.Sleep(3000);

    4.       终止线程:

    thread.Abort();

    5.      线程优先级,值为一枚举值,此属性作用是建议操作系统设置成此优先级。

    thread.Priority = ThreadPriority.Highest;

    六,前台线程与后台线程

    1.      设置方法:

    thread.IsBackground= true;

    设置为true是后台线程,为false为前台线程;

    2.      前台线程与后台线程的区别:

    前台线程:只有当所有的前台线程都关闭,程序才关闭。

    后台线程:若所有前台线程都关闭,则后台线程也会自动关闭。

    七,线程同步,解决多方法重入问题

    1.      Lock锁来实现线程同步:

    Person per = new Person();

                lock(per)

                {

                    //要执行代码

                    foreach(String str in(List<string>)list)

                    {

                        Console.WriteLine(str+ ",how are you?");

                    }

                    Thread.Sleep(3000);

                    Console.WriteLine("线?¨¬IDêo{0}"Thread.CurrentThread.ManagedThreadId);

                }

    将要执行的代码锁住,则解决多方法重入时共享资源的协调的问题。

    八,解决Winform中无法在一个线程中控制另一个线程创建的控件的问题

    1.      关闭C#的检查功能:

    Contorl.CheckForIllegalCrossThreadCalls=false;

    2.      使用Invoke()方法。

  • 相关阅读:
    解决Driver/library version mismatch
    ubuntu 16.04 nfs服务的搭建
    samba on ubuntu
    SSH连接下复制远程linux服务器文件到本地的命令(zz)
    R 语言入门(Ubuntu)
    new repository
    vlc play函数跟踪
    SSH连接下复制远程linux服务器文件到本地的命令(zz)
    c# HttpServer 的使用
    异步Udp监听关闭 出现异常,访问已释放的资源或者其他错误的解决方法
  • 原文地址:https://www.cnblogs.com/jietian331/p/3005768.html
Copyright © 2020-2023  润新知