此代码可以抛出异常吗?
public String[] GetPorts()
{
var sourceArray = Data;
var array = new String[sourceArray.Count];
for (int i = 0; i < array.Length; i++)
{
array[i] = Data[i][0];
}
return array;
}
数据为List<String[3]>
答案 0 :(得分:2)
如果可以从其他线程更改Data
,则表示您遇到了问题。例如,如果在迭代期间可能会更改Data
的大小,则可能会获得IndexOutOfBoundException
。此外,Data
可能不支持同时阅读和写作。 (写作可以在你用你提供的代码阅读的同时由其他线程完成。)
您应该使用互斥锁保护Data
。
如果我们知道哪种数据类型为Data
,我们可以为您提供更多信息。
根据MSDN,List<T>
不支持并发读者和作者。因此,如果其他代码可能会写入Data
,则必须保护{。}}。
答案 1 :(得分:1)
线程安全就是共享资源。
在您提供的代码段中,唯一可能的共享资源是Data
如果可以从一个线程访问数据,并且如果其中的维度可以更改,则不是 - 您的代码不是线程安全的。否则 - 它是
答案 2 :(得分:0)
只要您只为只读操作访问数组(您无法修改添加/更改项目的数组),它是线程安全的
答案 3 :(得分:0)
这取决于您是否要在一个步骤中复制数组,因此在这种情况下,当另一个线程从Data
中删除项时可能会出现问题,因此缓存的循环限制array.Length
值将是错的,这可能导致IndexOutOfBoundException
Data[i][0]
答案 4 :(得分:0)
鉴于您提供的详细信息,此代码不是线程安全的,是的,它可以抛出异常。您的Data变量是一个未知的密钥,如果其他线程可以访问它,那么您可以使用此方法获得各种意外行为。