System.Threading 命名空间 (进程、线程)

创建时间:
2014-02-04 00:11
最近更新:
2018-06-11 09:41

相关

  • 同步 (lock) - 详见本站专文
  • 异步 / 并发 / 多线程 - 详见本站专文

Resource - MSDN

  1. System.Threading 命名空间 - 该命名空间提供一些使得可以进行多线程编程的类和接口
  2. System.Threading.Thread 类 - 创建并控制线程,设置其优先级并获取其状态。一个进程可以创建一个或多个线程以执行与该进程关联的部分程序代码。
  3. Thread.Start 方法
  4. Thread.Sleep 方法
  5. Thread.Join 方法 - 阻止调用线程,直到某个线程终止时为止。
  6. Thread.IsAlive 属性 - 获取一个值,该值指示当前线程的执行状态。如果此线程已启动并且尚未正常终止或中止,则为 true;否则为 false。
  7. Thread.IsBackground 属性 - 获取或设置一个值,该值指示某个线程是否为后台线程。如果此线程是后台线程或即将成为后台线程,则为 true;否则为 false。默认为 false。

Resource

  1. 理解 Thread.Sleep 函数
  2. 深入浅出多线程系列之一: 简单的 Thread
  3. 深入浅出多线程系列之二: 关于 Thread 的那些事
  4. 深入浅出多线程系列之三: 线程池
  5. 为什么要放弃使用 Thread.Sleep
  6. Thread.Sleep 和 Timer 性能比较
  7. Thread.Sleep(0) vs Sleep(1) vs Yeild

Resource - 给线程传递参数

  1. MSDN - 给线程传递参数
  2. 给线程传递参数 - 使用 Lambda 表达式或匿名函数传递参数
  3. 利用 lambda 匿名方法传递多个参数
  4. C# 往线程里传参数的方法总结
  5. C# 线程调用带参数的方法
  6. 利用 thread.Start() 传递参数

测试记录 - 多线程读写静态字段

using System;
using System.Threading;

namespace Net451Console
{
    class Program
    {
        static void Main(string[] args)
        {
            var thread0 = new Thread(new Program().Work);
            var thread1 = new Thread(new Program().Work);
            var thread2 = new Thread(new Program().Work);

            thread0.Name = "thread0";
            thread1.Name = "thread1";
            thread2.Name = "thread2";

            thread0.Start();
            thread1.Start();
            thread2.Start();

            //Thread.Sleep(0);
            Console.WriteLine("z" + A._Count);
        }
        public void Work()
        {
            string name = Thread.CurrentThread.Name;
            if(A._Count > 0) {
                Console.WriteLine(name + ": a" + A._Count);
            }
            else {
                A._Count = 3;
                Console.WriteLine(name + ": b" + A._Count);
            }
        }
    }
    public class A
    {
        public static int _Count;
    }
}

测试记录 - Thread.Join()

using System;
using System.Threading;

namespace Net451Console
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread t = new Thread(Go);
            t.Start();
            //t.Join(); //输出 1000 个 "y"。
            //t.Join(1); //输出少于 1000 个 "y"。
            t.Join(11); //输出少于 1000 个 "y"。
            Console.WriteLine("Thread t has ended!");
        }

        static void Go()
        {
            for(int i = 0; i < 1000; i++) {
                Console.Write("y");
            }
        }
    }
}

P1602 生产代码备份

if(list.Count < 1) {
    new Thread(() => SetResult()).Start();
    Thread.Sleep(1000);
    SetImportState(ImportState.NameOk, ImportState.UnitOk);
}
//http://localhost:8082/Services/ExamResultSummaryService.asmx?op=Import
[WebMethod(Description = "Import")]
public string Import(string json)
{
    try {
        //使重复调用幂等:
        if(!CFTC.Hea.DAL.ImportStatus._IsProcessing) {
            CFTC.Hea.DAL.ImportStatus._IsProcessing = true;
            string planId = json.Get<string>("PlanId");
            string hospitalId = json.Get<string>("HospitalId");
            new Thread(() => _currentService.Import(planId, hospitalId)).Start();
            //CFTC.Base.Framework.Context.UserInfo userInfo = SecurityContext.Current.UserInfo;
            //new Thread(() => new ExamResultBll().Import(userInfo)).Start();
        }

        Thread.Sleep(100);
        var result = new {
            IsProcessing = CFTC.Hea.DAL.ImportStatus._IsProcessing,
            Count = CFTC.Hea.DAL.ImportStatus._Count,
            Current = CFTC.Hea.DAL.ImportStatus._Current,
        };
        return ResultToJson(result);
    }
    catch(Exception ex) {
        return ResultToJson(ex);
    }
}