首页 > 其他分享 >Task线程问题

Task线程问题

时间:2023-02-10 14:23:11浏览次数:53  
标签:Task Console Thread System 问题 线程 WriteLine

引用自C# Task详解 - 五维思考 - 博客园 (cnblogs.com)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;

namespace Task4
{
internal class Program
{

 

// static void Main(string[] args)
// {
// }

 

// ************************************************
//static void Main(string[] args)
//{
// var t1 = new Task(() => TaskMethod("Task 1")); // var t3=new Task(()=>方法(参数));
// var t2 = new Task(() => TaskMethod("Task 2")); //Task t4 =new Task(()=> 方法());
// t2.Start(); //t3.Start();
// t1.Start();
// Task.WaitAll(t1, t2); //等待t1,t2两个线程任务都完成。
// Task.Run(() => TaskMethod("Task 3"));
// Task.Factory.StartNew(() => TaskMethod("Task 4"));
// //标记为长时间运行任务,则任务不会使用线程池,而在单独的线程中运行。
// Task.Factory.StartNew(() => TaskMethod("Task 5"), TaskCreationOptions.LongRunning);

// #region 常规的使用方式
// Console.WriteLine("主线程执行业务处理.");
// //创建任务
// Task task = new Task(() =>
// {
// Console.WriteLine("使用`System.Threading.Tasks.Task`执行异步操作.");
// for (int i = 0; i < 10; i++)
// {
// Console.WriteLine(i);
// }
// });
// //启动任务,并安排到当前任务队列线程中执行任务(System.Threading.Tasks.TaskScheduler)
// task.Start();
// Console.WriteLine("主线程执行其他处理");
// task.Wait();
// #endregion
// Console.WriteLine("eeeeeeeee");
// Thread.Sleep(TimeSpan.FromSeconds(3));
// Console.WriteLine("qqqqqqqqqq");
// Console.ReadLine();
//}
//static void TaskMethod(string name)
//{
// Thread.Sleep(3000);
// Console.WriteLine("Task {0} is running on a thread id {1}. Is thread pool thread: {2}",
// name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
//}
//************************************

 

//static void Main(string[] arge)
//{
// string acd = "ss";
// var t1 = new Task(() => TaskMethod("Task 1"));
// var t2 = new Task(() => TaskMethod("Task 2"));
// t2.Start();
// t1.Start();
// //Task.WaitAll(t1, t2);
// Task.Run(() => TaskMethod("Task 3"));
// Task.Factory.StartNew(() => TaskMethod("Task 4"));
// //标记为长时间运行任务,则任务不会使用线程池,而是在单独的线程中运行。
// Task.Factory.StartNew(() => TaskMethod("Task5"), TaskCreationOptions.LongRunning);

// #region 常规的使用方法
// Console.WriteLine("主线程执行业务处理");
// //创建任务
// Task task = new Task(() =>
// {
// Console.WriteLine("使用system.Threading.Tasks.Task执行异步程序操作");
// for (int i = 0; i < 10; i++)
// {
// Console.WriteLine(i);
// Thread.Sleep(TimeSpan.FromSeconds(1));
// }
// });
// //启动任务,并安排到当前任务列队线程中执行任务(System.Threding.Tasks.TaskScheduler)
// task.Start();
// task.Wait();
// #endregion

// Thread.Sleep(TimeSpan.FromSeconds(2));
// Console.ReadLine();

//}
//static void TaskMethod(string name)
//{
// // Thread.Sleep(3000);
// Console.WriteLine("Task {0} is running on a thread id {1}.Is thread pool thread:{2}",name,Thread.CurrentThread.ManagedThreadId,Thread.CurrentThread.IsThreadPoolThread );
// Thread.Sleep(3000);
//}


//***************************************
static void Main(string[] ages)
{
//1方法
Task t1 = new Task(() => ThreadInvoke("Tfhrea1"), TaskCreationOptions.LongRunning);
var t2 = new Task(() => ThreadInvoke("Thread2"));
t1.Start();
t2.Start();
Task.WaitAll(t1,t2); //等待t1,t2两个线程完成后运行下面的代码
//方法2 Run模式
Task.Run(() => ThreadInvoke("Thread3"));
//方法3 工厂模式
Task.Factory.StartNew(() => ThreadInvoke("Thread4"));
//方法4 标记为长运行模式,不从线程池调用线程 //标记为长时间运行任务,则任务不会使用线程池,而是在单独的线程中运行。
Task.Factory.StartNew(() => ThreadInvoke("Thread 5"),TaskCreationOptions.LongRunning);
//---------------------------------//方法1,方法3可以用TaskCreationOptions.LongRunning模式,方法2不可以

#region 正常主线程内的程序
//主线程任务
Console.WriteLine("主线程执行业务处理");
//创建任务
Task t6 =new Task(()=>
{
Console.WriteLine("使用system.Threading.Tasks.Task执行异步程序操作");
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i);
Thread.Sleep(TimeSpan.FromSeconds(1));
}
});
//启动任务,并安排到当前任务列队线程中执行任务(System.Threding.Tasks.TaskScheduler)
t6.Start();
t6.Wait(); //等待t6任务完成在执行下面的程序
#endregion


// async await
Task t8=new Task(() => AsyncMethod("t8"));
t8.Start();
Task.WaitAll(t8);
// AsyncMethod("_____++++++++______");
Console.WriteLine("等待主线程结束");
//等待2秒
Thread.Sleep(TimeSpan.FromSeconds(2));
Console.WriteLine("主线程结束,等待关闭");
Console.ReadLine();


}
static void ThreadInvoke( string name)
{
Thread.Sleep(TimeSpan.FromSeconds(1.5)); //非常精准的1.5秒
Console.WriteLine($"this {name} is running on a ThreadID{Thread.CurrentThread.ManagedThreadId},is thread pool thread{Thread.CurrentThread.IsThreadPoolThread}");
Thread.Sleep(2000); //不是特别精准的2秒。

}
public async static void AsyncMethod( string name)
{
await Task.Run(() =>
{
for (int i = 0; i < 5; i++)
{
Thread.Sleep(1000);
Console.WriteLine(name+i);
}
});
Console.WriteLine(@"这个{name}完成了");
//这个方法因为用了async和await,所以执行的顺序是先把Task.Run(() =>内的程序段执行完,在执行 Console.WriteLine(@"这个{name}完成了");这段代码,如果把async和await去
//掉,在 Task.Run(() =>内的代码执行时,就会执行 Console.WriteLine(@"这个{name}完成了");这段代码
}
}

}

 

标签:Task,Console,Thread,System,问题,线程,WriteLine
From: https://www.cnblogs.com/daimalianxisheng/p/17108755.html

相关文章