c#Task及其线程模型

###涉及概念

SynchronizeContext 同步上下文

TaskScheduler 调度器

Task 任务

一个Context 下有一个调度器,默认是 ThreadPool Scheduler 线程池调度器 ThreadPoolTaskScheduler

当向DefaultTask 调度器中Post Task的时候,Task会被调动到线程池中的某个WorkThread上去

因此多个Task访问数据存在线程安全的问题

每个Task执行需要将自身扔个调度器处理,通常两种 ThreadPool 调度器和 SynchronizationContext 调度器

SynchronizationContext 调度器相当于提供了一个Hook点,可以对任务的调度做一些处理

SynchronizationContext 本身是线程局部变量,保证了Context和线程绑定

其默认实现,也是使用线程池来调度执行Task

要保证一个 SynchronizationContext 下所有任务没有线程冲突,就需要重写 SynchronizationContext 的Post方法

当调度器向其Post Task 来执行的时候,通过锁,来确保当前没有其它Task执行,来保证数据访问的安全性

网络应用程序中,很容易出现线程访问问题,主要原因:

1:网络IO需要有线程处理

2:业务逻辑本身在其它线程中处理

3:业务逻辑async 异步方式,使用到了线程池调度

这些情况就会导致多线程资源访问的问题

解决方法:

1:根据Service 来划分资源管理,一组资源同时只能有一个Task处理

2:状态资源全局化,内存无缓存状态,状态都存储在redis或者mysql之类的外部数据仓库中,外部仓库自身保证多线程数据安全

转载于:https://my.oschina.net/u/186074/blog/3068982

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值