首页 新闻 赞助 找找看

2个线程同时处理一个变量是否会发生异常

0
[已解决问题] 解决于 2016-12-05 21:53

 如题,现在有List<string> errorIDS = new List<string>(),这个集合我用来保存出错的数据

服务中有2个Timer,一个用来处理数据,如果发生异常,errorID.Add("错误数据的ID")

另一个Timer用来修复异常数据,在Tick事件中遍历errorIDS,这里会不会有问题,当正在遍历的时候,第一个timer执行了errorID.Add("错误数据的ID")

MSky的主页 MSky | 菜鸟二级 | 园豆:436
提问于:2016-12-05 08:55
< >
分享
最佳答案
1

ConcurrentBag<T>

奖励园豆:5
Daniel Cai | 专家六级 |园豆:10424 | 2016-12-05 09:13

 要的就是他了!!!

string id;
if (errorIDS.TryTake(out id)) {}

这样跟用Queus是一个效果了吧

MSky | 园豆:436 (菜鸟二级) | 2016-12-05 09:26

@MSky:你有dequeue的过程么?有的话就用concurrentqueue吧。

Daniel Cai | 园豆:10424 (专家六级) | 2016-12-05 10:04

@Daniel Cai: 是的,已经用了

MSky | 园豆:436 (菜鸟二级) | 2016-12-05 21:52
其他回答(3)
0

用队列、要求5个字。

s_p | 园豆:138 (初学一级) | 2016-12-05 08:57
0

 如果只是读取,写入操作,变量声明全局应该没问题,但是你在另一个处理异常线程中,假设处理成功,你肯定要移除errorid,这时候你在操作这个变量就会错误,建议还是使用保证线程安全的集合,去记录errorids

hellohello-tom | 园豆:329 (菜鸟二级) | 2016-12-05 09:09
1

List是非线程安全类型,肯定是有问题的,你可以用ConcurrentBag、ConcurrentQueue,或者自己实现线程同步

balahoho | 园豆:2050 (老鸟四级) | 2016-12-05 09:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册