Hi!
running the given sample from below I get a Data Race reported for the "LambdaCausesDataRace" test and no Data Race for the "ForeachLoopCausesNoDataRace" test. Why?
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Concurrency.TestTools.UnitTesting;
namespace MOCTestProject
{
public class AlpacaTest2
{
[DataRaceTestMethod]
public void ForeachLoopCausesNoDataRace()
{
var parameters = new[] { new object(), "test", 5 };
string result1 = null;
string result2 = null;
Parallel.Invoke(
() =>
{
result1 = ParametersToTypeListUsingForeachLoop(parameters);
},
() =>
{
result2 = ParametersToTypeListUsingForeachLoop(parameters);
}
);
Assert.AreEqual("Object, String, Int32", result1);
Assert.AreEqual("Object, String, Int32", result2);
}
private static string ParametersToTypeListUsingForeachLoop(object[] parameters)
{
List<string> result = new List<string>();
foreach (var p in parameters)
{
result.Add(p == null ? null : p.GetType().Name);
}
return string.Join(", ", result);
}
[DataRaceTestMethod]
public void LambdaCausesDataRace()
{
var parameters = new[] { new object(), "test", 5 };
string result1 = null;
string result2 = null;
Parallel.Invoke(
() =>
{
result1 = ParametersToTypeListUsingLambda(parameters);
},
() =>
{
result2 = ParametersToTypeListUsingLambda(parameters);
}
);
Assert.AreEqual("Object, String, Int32", result1);
Assert.AreEqual("Object, String, Int32", result2);
}
private static string ParametersToTypeListUsingLambda(object[] parameters)
{
return string.Join(", ", parameters.Select(p => p == null ? null : p.GetType().Name).ToArray());
}
}
}
-Matthias