zoukankan      html  css  js  c++  java
  • C#多线程技术(一)

    公司项目有可能采用C#编写,如果用到,必然会涉及到多线程技术,基本的概念都是相同的,差别是具体的代码。

    在C#中,线程函数执行被封装在类中,通过类对象的Start函数启动线程执行函数。线程类Thread接受的是一个ThreadStart的delegate类型对象,具体代码应该如下:

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Threading;
     6 
     7 namespace MultiThreadTest
     8 {
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13             Thread thread1 = new Thread(
    14                         delegate()
    15                         {
    16                             Console.WriteLine("Hello Here!");
    17                         }
    18                     );
    19             Thread thread2 = new Thread(
    20                     () =>            // lambda 表达式
    21                     {
    22                         Console.WriteLine("Well then goodbye!\n");
    23                     }
    24                 );
    25 
    26             thread1.Start();
    27             thread2.Start();
    28         }
    29     }
    30 }
    31 

     通常在多线程中,我们需要等待所有的线程都结束,系统才会等待运行退出。这个时候,可以调用线程对象的Join函数,该函数在线程达到尾部结束的时候,会进行线程返回。

    当线程个数很多的时候,不带参数的Join函数需要多次调用,非常费时费劲,这个时候,可以调用带时间参数的Join函数,当超过时间后,系统强制结束线程运行,如下面的代码:

    1             if ( !thread.Join(30000))
    2             {
    3                 thread.Abort();
    4             }

     之前处理的线程函数,都无法对数据状态进行保存处理,这样,对于复杂应用显然不是特别适合,C#的Thread采用ThreadStart委托方式,可以很好的解决这个问题:

    代码
     1     class ThreadedTask{
     2         string _whatToSay;
     3         public ThreadedTask(string whatToSay){
     4             _whatToSay = whatToSay;
     5         }
     6 
     7         public void MethodToRun(){
     8             Console.WriteLine("I am babbling ( " + _whatToSay + " )");
     9         }
    10     }
    11 
    12 
    13         ThreadedTask task = new ThreadedTask("hello");
    14 
    15         Thread thread = new Thread(
    16                             new ThreadStart(task.MethodToRun)
    17                         );
    18         thread.Start();

     字符串hello被存在类中,通过委托的方式将MethodToRun方法委托到线程内部,然后调用Start函数,这个时候,保存到类中的数据也可以被准确获取出来。


  • 相关阅读:
    HTML中为何P标签内不可包含块元素?
    js判断鼠标位置是否在某个div中
    拒绝图片延迟加载,爽爽的看美图
    PHP为什么会被认为是草根语言?
    宜信开源微服务任务调度平台(SIA-TASK)
    JSBridge框架解决通信问题实现移动端跨平台开发
    如何运用多阶构建编写优雅的Dockerfile
    Sharding-JDBC 使用入门和基本配置
    程序员笔记|详解Eureka 缓存机制
    程序员笔记|常见的Spring异常分析及处理
  • 原文地址:https://www.cnblogs.com/ubunoon/p/1670789.html
Copyright © 2011-2022 走看看