zoukankan      html  css  js  c++  java
  • 线程操作若干(复习)

    lock关键 (lock的本质就是Monitor,另外Monitor,Mutex也是排它锁,相比之下Mutex是夸进程的)

    1  lock(this)
    2 {
    3         Callback(" A-" + count.ToString());                
    4 }

    ILspy下看到的

     1 bool flag = false;
     2 try
     3 {
     4     Monitor.Enter(this, ref flag);
     5     this.Callback(" A-" + i.ToString());
     6 }
     7 finally
     8 {
     9     if (flag)
    10     {
    11         Monitor.Exit(this);
    12     }
    13 }

    Task取消

     1                 CancellationTokenSource tokenSource = new CancellationTokenSource();
     2                 CancellationToken token = tokenSource.Token;
     3                 Task task = new Task(() =>
     4                 {
     5                     try
     6                     {
     7                         for (int i = 0; i < int.MaxValue; i++)
     8                         {
     9                             if (token.IsCancellationRequested)
    10                             {
    11                                 Console.WriteLine("task is cancel");
    12                                 token.ThrowIfCancellationRequested();                                
    13                             }
    14                             else
    15                             {
    16                                 Console.WriteLine("Int value {0}", i);
    17                             }
    18                         }
    19                     }
    20                     catch(OperationCanceledException)
    21                     {
    22                         Console.WriteLine("cancelling task callback");
    23                     }
    24                 }, token);
    25            
    26                 Console.WriteLine("Press enter to start task");
    27                 Console.WriteLine("Press enter again to cancel task");
    28                 Console.ReadKey();              
    29                 task.Start(); 
    30               
    31                 Console.ReadKey(); 
    32                 tokenSource.Cancel();
    View Code For 线程取消

     Task并行

    1  static void  DoAction(int i)
    2  {          
    3             Thread.Sleep(300* i);
    4             Console.WriteLine("msg:" + i.ToString());
    5  } 
    6 
    7   Parallel.For(0, 10, i => DoAction(i));

    Task串行

     1       static int Task1(object state)
     2         {
     3             int i = (int)state;
     4          
     5             Thread.Sleep(100* (10-i));          
     6             Console.WriteLine("task1:" + i.ToString());
     7             i += 1;
     8             return i;
     9         }
    10 
    11         static int Task2(Task<int> t)
    12         {
    13             var i = t.Result;
    14             Console.WriteLine("task2:" + i.ToString());
    15             Thread.Sleep(100*(11-i));
    16             i *= 10;
    17             return i;
    18         }
    19 
    20         static Task<int> MergerTask(object input)
    21         {
    22             Task<int> t = new Task<int>(Task1, input);
    23             var t2 = t.ContinueWith<int>(Task2);
    24             t.Start();
    25             return t2;
    26         }
    27 
    28         static async void DoTask(int input)
    29         {
    30             var result= await MergerTask(input);
    31             Console.WriteLine("merger-task:"+ input +" result: "+ result);
    32         }    

    调用

    1 for (int i = 1; i < 10; i++)
    2 {
    3           DoTask(i);
    4 }

    线程量行--Semaphore  限制同一时间内只能跑几个线程,用于排队类型

     1         static Semaphore _sem = new Semaphore(3, 3);
     2         static void Enter(object id)
     3         {
     4             Console.WriteLine(id + " waitting...");
     5             _sem.WaitOne();
     6             Console.WriteLine(id + " is in!");            
     7             Thread.Sleep(1000 * (int)id);              
     8             Console.WriteLine(id + " is leaving");    
     9             _sem.Release();
    10         }

    调用

    1  for (int i = 1; i <= 10; i++)
    2   {
    3           new Thread(Enter).Start(i);
    4    }
  • 相关阅读:
    将springboot安装成windows服务启动。
    jackson将json数组转成List、普通数组。
    maven编译正常,运行报错:中没有主清单属性
    [SQL]SUTFF内置函数的用法 (删除指定长度的字符并在指定的起始点插入另一组字符)
    sql语句中charindex的用法 可用于截取字符串
    C# 中怎么将string转换成int型
    C#判断奇偶数的函數
    asp.net 下载Excel (数据流,不保存)--客户端
    C# DateTime 日期加1天 减一天 加一月 减一月 等方法(转)
    ASP.NET jquery ajax传递参数
  • 原文地址:https://www.cnblogs.com/AspDotNetMVC/p/5700709.html
Copyright © 2011-2022 走看看