【发布时间】:2020-01-23 10:41:09
【问题描述】:
public async Task<Informations> DoSthAsync
{
var informations = new List<Informations>();
await Task.WhenAll(FirstTask(informations), SecondTask(informations));
return informations;
}
public async Task FirstTask(List<Informations> list)
{
await Task.Run( () => //do sth with list);
}
public async Task SecondTask(List<Informations> list)
{
await Task.Run( () => //do sth with list);
}
我想问一下,如果这段代码可能会导致问题,两个任务何时会使用同一个列表?
谢谢。
【问题讨论】:
-
如果任务开始后没有任何更改列表,则该列表是安全的。虽然从长远来看,您可能应该使用
ImmutableList<> -
这取决于用列表做某事
-
第一个和第二个任务如何使用
List?是否会被修改,例如添加、替换或删除元素? -
还有
List不是唯一的问题...。即使您只迭代列表但更改Informations item,代码将是“线程不安全”并且ConcurrentBag将无济于事......所以对于更改集合ConcurrentBag是一种方式,但是对于修改项目,您需要在项目上lock
标签: c# multithreading thread-safety