多线程、异步、同步的简单示例

花了半天整理了多线程、异步、同步相关的几个对象

Thread 

创建一个线程进行多线程工作

Thread t new Thread(new ThreadStart(() => { Console.WriteLine("T"); }));

t.Start();



ThreadPool

把线程托管到.NET线程池中,减少了线程创建的开销

ThreadPool.QueueUserWorkItem((objState) => { Console.WriteLine(objState.ToString()); }, "a");



BackgroundWorker 

把线程托管到内部线程池,并且提供了信息进度反馈的能力

BackgroundWorker b new BackgroundWorker();

b.WorkerReportsProgress true;

b.DoWork += (s, e) => {

    for (int i = 1; i < 100; i++)

    {

        b.ReportProgress(i);

        Thread.Sleep(100);

    }

};

b.ProgressChanged += (s, e) => { Console.WriteLine(e.ProgressPercentage.ToString()); };

b.RunWorkerAsync();



Task

增强了ThreadPool的能力,支持线程停止,状态返回、线程等待

CancellationTokenSource cts new CancellationTokenSource();

Task t new Task((ct) =>

{

    while (!((CancellationTokenSource)ct).IsCancellationRequested)

    {

        Console.WriteLine(DateTime.Now.ToString());

        Thread.Sleep(200);

    }

    return;

},cts);

Console.WriteLine("Begin");

t.Start();

t.ContinueWith((s) =>

{

    Console.WriteLine("End");

});

//await a.ConfigureAwait(false);//支持线程等待

Console.Read();

cts.Cancel();

Console.Read();



Parallel

简化同步状态下Task的使用,多余多个任务同步状态下并行执行提供帮助

List<int> nums = new List<int>() { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};

Parallel.ForEach(nums, (i) => { Console.WriteLine(i.ToString()); });



Parallel.Invoke(() =>

{

    Console.WriteLine("Begin");

    Thread.Sleep(2000);

    Console.WriteLine("End");

},

() =>{

    Console.WriteLine("Begin");

    Thread.Sleep(2000);

    Console.WriteLine("End");

});



PLinq

Parallel方式在Linq下的实现

List<int> nums = new List<int>() { 12345678910111213141516 };

nums.AsParallel().ForAll((x) => { Console.WriteLine(x.ToString()); });



async  await

用同步的编程方式编写异步代码,主要用于解决一部代码编写代码臃肿的情况,异步执行的Task被他用await等待同步执行

public async static void  AA()

{

    for (int i = 0; i < 100; i++)

    {

        int i2 = await Sleep(i);

        Console.WriteLine(i.ToString());

    }

}

 

public static Task<int> Sleep(int i)

{

    var t= new Task<int>(() =>

    {

        Thread.Sleep(1000);

        return i * i;

    });

    t.Start();

    return t;

}

 

你可能感兴趣的:(多线程)