多线程问题,用法其实并不难,难的是在复杂的场景用不好,多线程的用法大家能知道几个?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}";
}
以后再维护吧。。。。。。。。。。