【发布时间】:2012-02-09 18:17:19
【问题描述】:
我今天在我们的代码库中发现了以下方法,我觉得它可能不是线程安全的。我认为 IEnumerable 可能是一个引用类型,并且在执行此代码时可能会被另一个线程修改。这是正确的,还是这种方法毕竟是线程安全的?如果不是,这种方法是否适合静态?似乎使它成为实例方法不会改变实体参数在另一个线程中被修改的可能性。
/// <summary>
/// Writes the Entity data in <paramref name="entities"/> to a CSV file located at <paramref name="path"/>.
/// </summary>
/// <typeparam name="T">The Entity Type.</typeparam>
/// <param name="entities">A List of Type LinqEntityBase.</param>
/// <param name="path">The location of the CSV file.</param>
internal static void LinqEntitiesToCsv<T>(IEnumerable<T> entities, string path) where T : LinqEntityBase
{
var entityBuilder = new StringBuilder();
List<KeyValuePair<string, int>> columnInfos = GetColumnInfos<T>();
for (int i = 0; i < columnInfos.Count; i++)
{
string columnName = columnInfos[i].Key;
entityBuilder.Append(columnName.Contains(',') ? columnName.WrapIn('\"') : columnName);
entityBuilder.Append(i < columnInfos.Count - 1 ? "," : string.Empty);
}
entityBuilder.Append(Environment.NewLine);
PropertyInfo[] propertyInfos = typeof (T).GetPropertiesFromCache().ToArray();
foreach (T entity in entities)
{
for (int i = 0; i < propertyInfos.Length; i++)
{
var columnAttribute = Attribute
.GetCustomAttribute(propertyInfos[i], typeof (ColumnAttribute))
as ColumnAttribute;
if (columnAttribute == null)
{
continue;
}
object value = propertyInfos[i].GetValue(entity, null);
string valueString = (value != null) ? value.ToString() : string.Empty;
entityBuilder.Append(valueString.Contains(',') ? valueString.WrapIn('\"') : valueString);
entityBuilder.Append(i < columnInfos.Count - 1 ? "," : string.Empty);
}
entityBuilder.Append(Environment.NewLine);
}
FileHelper.TryWriteTextFile(path, entityBuilder.ToString());
}
【问题讨论】:
标签: c# .net multithreading static thread-safety