.NET CORE 中实现多线程的两种方法(个人经验总结),两种方法使用的场景不同,范例下载:demo
1.使用ThreadPool
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp1
{
public class MyThreadPool
{
public static void Run()
{
Console.WriteLine("");
Console.WriteLine("");
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:start [MyThreadPool]");
int ThreadCount = 10;
ThreadPool.SetMaxThreads(ThreadCount, ThreadCount);
// 待計算的清單
for (int i = 0; i < 12; i++)
{
ThreadPool.QueueUserWorkItem(Method1, i);
}
// 全部計算完成,啟動 Method2
while (true)
{
Thread.Sleep(1000);
int worker = 0;
int completionPort = 0;
ThreadPool.GetAvailableThreads(out worker, out completionPort);
Console.WriteLine(worker.ToString() + "---" + completionPort.ToString());
if (worker == ThreadCount)
{
Method2();
break;
}
}
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:end [MyThreadPool]");
}
private static void Method1(object obj)
{
Thread.Sleep(1000);
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}: Method1 " + obj.ToString());
}
private static void Method2()
{
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}: Method2 completed");
}
}
}
2.使用async Task
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp1
{
public class MyAsyncMethod
{
public static void Run()
{
Console.WriteLine("");
Console.WriteLine("");
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:start [MyAsyncMethod]");
var m1 = AsyncMethod1();
var m2 = AsyncMethod2();
m1.Wait();
var m3 = AsyncMethod3(m1.Result);
m2.Wait();
m3.Wait();
var result = m1.Result + m2.Result + m3.Result;
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:run result: {result}");
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:end [MyAsyncMethod]");
}
static async Task<int> AsyncMethod1()
{
await Task.Run(() => {
Thread.Sleep(1000);
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:sleep 1000ms in AsyncMethod1");
});
return 1;
}
static async Task<int> AsyncMethod2()
{
await Task.Run(() => {
Thread.Sleep(2000);
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}: sleep 2000ms in AsyncMethod2");
});
return 2;
}
static async Task<int> AsyncMethod3(int index)
{
await Task.Run(() => {
Thread.Sleep(3000);
Console.WriteLine($"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss ms")}:sleep 3000ms in AsyncMethod3");
});
return ++index;
}
}
}
Main method:
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Console.OutputEncoding = System.Text.Encoding.UTF8;
MyAsyncMethod.Run();
MyThreadPool.Run();
Console.ReadLine();
}
}
}
Running result: