C#多线程

class Program
{
static void Main(string[] args)
{
#region 创建工作线程
//创建工作线程
//Thread thread = new Thread(DoWork);
//thread.Name = "工作线程1";
//// 启动线程
//thread.Start();
//thread.Join();


////创建工作线程2
//Thread thread2 = new Thread(DoWork2);

//thread2.Start();
//thread.Join();

////主线程继续执行
//for (int i = 0; i < 5; i++)
//{
// Console.WriteLine("主线程Worker Thread" + i);
// Thread.Sleep(2000);
//}
//Console.ReadLine();
#endregion
//string threadName = Thread.CurrentThread.Name;
#region 前后台线程
//演示前台、后台线程
BackGroundTest background = new BackGroundTest(10);
//创建前台线程
Thread fThread = new Thread(new ThreadStart(background.RunLoop));
//给线程命名
fThread.IsBackground = false;
fThread.Name = "前台线程";


BackGroundTest background1 = new BackGroundTest(20);
//创建后台线程
Thread bThread = new Thread(new ThreadStart(background1.RunLoop));
bThread.Name = "后台线程";
//设置为后台线程
bThread.IsBackground= true;

//启动线程
fThread.Start();
bThread.Start();
#endregion

#region new task
//Task task = new Task(() =>
//{
// Console.WriteLine($"Task 开启线程{Thread.CurrentThread.ManagedThreadId}处理业务");
// Thread.Sleep(2000);
//});
//task.Start();
#endregion

#region Task.Run(Action action)将任务放在线程池队列,返回并启动一个Task
//Task task1 = Task.Run(() =>
//{
// //Thread.CurrentThread.Name = "taskrun";
// Console.WriteLine($"Task 开启线程{Thread.CurrentThread.ManagedThreadId}处理业务{Thread.CurrentThread.Name}");
//});
//Task task = Task.Run(DoWork);
#endregion
#region task静态属性获取factory
//Task task = Task.Factory.StartNew(() =>
//{
// Console.WriteLine($"开启线程{Thread.CurrentThread.ManagedThreadId}处理任务");
// //Thread.Sleep(2000);
// Task.Delay(2000); // 等待 1 小时
//});
#endregion

#region TaskFactory 工厂实例化,二者概念不一样
//TaskFactory taskfactory1 = new TaskFactory();
//taskfactory1.StartNew(async () =>
//{
// Console.WriteLine($"{Thread.CurrentThread.ManagedThreadId}处理任务");
// await Task.Delay(2000);
//});
#endregion

#region task有返回值的创建方式
////1.new 实例化一个Task,需要通过Start方法启动
//Task<string> task = new Task<string>(() =>
//{
// return $"hello task1id为{Thread.CurrentThread.ManagedThreadId}";
//});
//task.Start();
////2.Task.Factory.StartNew(Func func)创建和启动一个Task
//Task<string> task2 = Task.Factory.StartNew<string>(()=> {
// return $"hello task2id为{Thread.CurrentThread.ManagedThreadId}";
//});
////3.Task.Run(Func func)将任务放在线程池队列,返回并启动一个Task
//Task<string> task3 = Task.Run<string>(()=> {
// return $"hello task3id为{Thread.CurrentThread.ManagedThreadId}";
//});
//Console.WriteLine("执行主线程"+Thread.CurrentThread.ManagedThreadId);
//Console.WriteLine(task.Result);
//Console.WriteLine(task2.Result);
//Console.WriteLine(task3.Result);
#endregion

#region 委托与lambda
//ContinueWithTest();
//ContinueWithTest1();
#endregion

#region task实例方法
//Console.WriteLine($"主线程{Thread.CurrentThread.ManagedThreadId}开启");
//var task1 = Task.Run(()=> {
// Console.WriteLine($"task1开启线程{Thread.CurrentThread.ManagedThreadId}");
// Thread.Sleep(10000);
//});
//task1.Wait();
//var task2 = Task.Run(()=> {
// Console.WriteLine($"task2开启线程{Thread.CurrentThread.ManagedThreadId}");
// Thread.Sleep(5000);
//});
//task2.Wait();
//var task3 = Task.Run(() => {
// Console.WriteLine($"task3开启线程{Thread.CurrentThread.ManagedThreadId}");
// Thread.Sleep(500);
//});
//task3.Wait();
//var task4 = Task.Run(() => {
// Console.WriteLine($"task4开启线程{Thread.CurrentThread.ManagedThreadId}");
// Thread.Sleep(2000);
//});
//task4.Wait();
//Console.WriteLine($"主线程{Thread.CurrentThread.ManagedThreadId}完成");
//Console.ReadKey();

#endregion

Console.ReadLine();
}

static void DoWork()
{
for (int i= 0;i < 5;i++)
{
Console.WriteLine("Worker Thread" +i);
Thread.Sleep(2000);

 


}
}
static void DoWork2()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("Worker2 Thread" + i);
Thread.Sleep(1000);
}
}
private static void ContinueWithTest()
{
Console.WriteLine("Start");

Task<string> task1 = new Task<string>(()=> {
Console.WriteLine("task0");
return "task100";
});

Task<string> task2 = task1.ContinueWith(t =>
{
Console.WriteLine(t.Result);
return "task2";
});
task1.Start();
Console.WriteLine("end");
}

private static void ContinueWithTest1()
{
Console.WriteLine("Start");
Task<string> task1 = new Task<string>(DoTask1);
Task<string> task2 = task1.ContinueWith(DoTask2);
task1.Start();
Console.WriteLine("end");
}
private static string DoTask1()
{
Console.WriteLine("task0");
return "task100";
}
private static string DoTask2(Task<string> t)
{
Console.WriteLine(t.Result);
return "task200";
}
}

class BackGroundTest
{
private int Count;
public BackGroundTest(int count)
{
this.Count = count;
}
public void RunLoop()
{
//获取当前线程的名称
string threadName = Thread.CurrentThread.Name;
for (int i = 0; i < Count; i++)
{
Console.WriteLine("{0}计数:{1}", threadName, i.ToString());
//线程休眠500毫秒
Thread.Sleep(1000);
}
Console.WriteLine("{0}完成计数", threadName);

}
}

posted @ 2025-03-18 10:53  半、枫  阅读(16)  评论(0)    收藏  举报