C# 多线程问题

多线程问题,用法其实并不难,难的是在复杂的场景用不好,多线程的用法大家能知道几个?Thread? ThreadTool?

提示:任何多线程离不开委托

下面我们详细讲一下多线程的历程:

.net framework 1.0    Thread

最初版本多线程Thread, 功能非常丰富也很强大,但是呢也很容易出错,主要是多线程是从操作系统中拿的,如果线程太多,很容易系统卡死。你遍历循环执行一万个Thread你看一下肯定要崩溃。

我们简单展示一下多线程Thread的简单用法:

ThreadStart ts = new ThreadStart(new Program().GetAge);
Thread th = new Thread(ts);
th.Start();
th.Abort(); //终止线程

public void GetAge()
{
   Thread.Sleep(2000);
   //Console.WriteLine($"name: {name}, age: {age}");
}

确保没有输入参数,没有返回参数

.net framework 2.0    ThreadPool

2.0之后呢引入ThreadPool这样一个概念,所有线程从线程池中获取,线程池可以设置最大线程数量,这样呢就不会影响系统线程被滥用导致系统卡死,但是有一个问题,ThreadPool 支持的功能 非常少,就导致了也是不很满足,下面我们简单用一下TheadPool:

WaitCallback wcb = new WaitCallback(new Program().GetAge);
ThreadPool.QueueUserWorkItem(wcb,"join");

public void GetAge(object kk)
{
   Thread.Sleep(2000);
   Console.WriteLine(kk);
}

提示:参数kk一定要有,这块代码会显示join

.net framework 3.0 Task

目前来说,在实践的过程中最为好用的就是Task,功能强大,而且也不会担心线程太多导致系统卡死,因为2.0版本的影响后续所有的线程都放到了线程池中,隐藏的很好,线程池会动态的启用以及释放掉。

我们看下Task的用法:

Task.Run(() => {
                Console.WriteLine($"你好坏!当前线程ID:            
                {Thread.CurrentThread.ManagedThreadId}");
});

Task.Run(GetAge);

Task.WaitAny();
Task.WaitAll();

public static void GetAge()
{
   Thread.Sleep(2000);
}

waitAny()  代表如果任何一个线程执行完就往下一步执行, waitAll() 等所有线程执行完才进行下一步操作,会阻塞主线程,值得注意的是,Task主线程也会参与计算,而不是像TheadPool 这种 全部分配给子线程来进行计算

.net framework 4.0 Parallel

4.0版本出现了一个Parallel  在某些情况呢是非常好用的,功能也不强大但适用某些场景,简单代码:

Parallel.Invoke(() => {
   Console.WriteLine("你好坏");
});

List<Action> actionList = new List<Action>();
actionList.Add(GetAge);
actionList.Add(() =>
{
   Console.WriteLine("你坏你坏");
});

Parallel.Invoke(actionList.ToArray());


public static void GetAge()
{
   Thread.Sleep(2000);
}

Parallel 还支持很多foreach 、for操作

.net framework new    Func<> Action<> 为什么是new 我也懒得查是那个版本出来的

Action<>  和 Func<>  作为委托不同之处在于 action针对无返回值的方法   func针对有返回值的方法,直接看例子吧

// Action
Action<int> age = new Action<int>(GetAge);
AsyncCallback ac = ack =>
{
	Console.WriteLine($"{ack.AsyncState}, this is real success");
};
IAsyncResult result = age.BeginInvoke(18, ac, "mom");
result.AsyncWaitHandle.WaitOne(1000);
Console.WriteLine($"{result.AsyncState}, this is real success. again");

Console.WriteLine("this is success");


// Func 
Func<int, string> ageValue = new Func<int, string>(GetAgeValue);
AsyncCallback acValue = ack =>
{

	Console.WriteLine($"{ack.AsyncState}, this is real success");
};
IAsyncResult resultValue = ageValue.BeginInvoke(18, acValue, "mom");
Console.WriteLine(age);
if (!resultValue.IsCompleted)
{
	Console.WriteLine("next");
}

resultValue.AsyncWaitHandle.WaitOne(1000);
Console.WriteLine($"result : {ageValue.EndInvoke(resultValue)}");
Console.WriteLine(resultValue);
Console.WriteLine($"{resultValue.AsyncState}, this is real success. again");

Console.WriteLine("this is success");

Console.ReadLine();



public static void GetAge(int age)
{
	Thread.Sleep(2000);
}

public static string GetAgeValue(int age)
{
	Thread.Sleep(2000);
	return $"{age}";
}

以后再维护吧。。。。。。。。。。

发布了17 篇原创文章 · 获赞 3 · 访问量 4044

猜你喜欢

转载自blog.csdn.net/HPFBoy/article/details/100556873