第二章 管理程序流(In .net4.5) 之 管理多线程

1. 概述

  本章包括同步资源以及取消长时间任务相关的内容。

2. 主要内容

  2.1 同步资源

    ① lock关键字实现。会阻塞程序,有可能会导致死锁。

    ② volatile关键字可以禁用编译优化,用于避免优化代码时对多线程的影响。

private static volatile int _flag = 0;

    ③ Interlocked关键字可以原子化一些简单数字运算和比较替换操作。

Interlocked.Increment(ref n); //
Interlocked.Decrement(ref n); //
Interlocked.Exchange(ref isInUse, 1);
Interlocked.CompareExchange(ref value, newValue, compareTo);

  2.2 取消任务

    ① CancellationToken

CancellationTokenSource cancellationTokenSource = 
    new CancellationTokenSource(); 
CancellationToken token = cancellationTokenSource.Token; 

Task task = Task.Run(() => 
{
    while(!token.IsCancellationRequested)
    {
        Console.Write("*");
        Thread.Sleep(1000);
    }
}, token);

Console.WriteLine("Please enter to stop the task");
Console.ReadLine();
cancellationTokenSource.Cancel();

    ② 使用Task.WaitAny()可以设置任务的超时时间。

Task longRunning = Task.Run(() =>
{
    Thread.Sleep(10000);
});

int index = Task.WaitAny(new[] {longRunning}, 1000);

if (index == -1)
    Console.WriteLine("Task time out ");

3. 总结

  ① 多线程环境访问共享数据时,要考虑避免数据的损坏和脏读。

  ② 使用lock关键字可以实现共享资源的多线程顺序访问。

  ③ 可以使用Interlocked实现简单的原子操作。

  ④ 可以使用CancellationTokenSource类的CancellationToken来控制取消任务。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。