多线程Thread /Task

多线程目的:希望“并行”执行多任务
Task : 基于Thread(线程)+ThreadPool(线程池)结合

Task的三种启动方式

【1】 Task对象的Start方法启动,适合在符合条件情况下去启动 ,按需求启动,灵活控制
Task task= new Task(()=>
{
.............
Console.WriteLine("new 一个新的Task,对应的子线程ID=" + Thread.CurrentThread.ManagedThreadId)
});
task.Start();

【2】 Run方法,是定义后直接启动,适合马上启动的情况
Task task= Task.Run(()=>
{
..............
Console.WriteLine("使用Task中的Run方法,对应的子线程ID=" + Thread.CurrentThread.ManagedThreadId);
});

【3】 Factory.StartNew 是定义后直接启动,受线程池影响 占用资源大
Task task= Task.Factory.StartNew(()=>
{

...............
Console.WriteLine("使用Task中的Factory.StartNew方法,对应的子线程ID=" + Thread.CurrentThread.ManagedThreadId);
});

===================================================================
Task任务启动
使用task.start()
Task任务取消
cancellationTokenSource cts
Task task =new Task(()=>
{
while( !cts.IsCancellationRequested){}
},cts.Token);
直接调用 cts.Cancel();
取消之前 需要添加 任务取消,重新创建cts对象
if (cts.IsCancellationRequested) cts= new cancellationTokenSource ;
Task任务暂停
//手动停止事件对象
private ManualResetEvent mResetEvent = new ManualResetEvent(true);
循环体添加 mResetEvent.WaitOne();
暂停时 直接调用 mResetEvent.Reset();
Task任务继续
继续时,直接调用 mResetEvent.Set();

===================================================================

Task跨线程访问控制和耗时任务的解决
主线程窗口的控件是不能直接被子线程访问
//这个就是解决跨线程访问控件的方法
task.Start(TaskScheduler.FromCurrentSynchronizationContext());
//耗时卡顿 耗时任务结束后,去更新UI 使用前是Task.Run(); 直接运行的情况
task.ContinueWith(task1=>{ .....},TaskScheduler.FromCurrentSynchronizationContext);

==================================================================

线程锁机制
多线程中的锁,多线程任务执行的时候,线程是处于并列执行的,若多个线程,同时访问一个“资源”,若没执行完,其他线程同时使用该资源时,造成资源的争夺,不能得到想要的结果。
使用线程锁,在一个线程使用一个资源的时候,其他线程必须等待
资源:对象,集合,方法等等
通常在对存储区进行读写时,会使用的锁机制,排队
private object mylock=new object();
lock(mylock){ ......//共同资源进行读取}
lock(this){//对当前对象进行锁机制}

posted @ 2025-09-03 14:38  $虫虫$  阅读(5)  评论(0)    收藏  举报