У меня есть метод C#, который будет вызываться несколько раз с использованием разных потоков. Итак, я хочу создать единичный тест, который будет проверять этот метод на несколько потоков, но я не уверен, что делаю это правильно.Тест многопоточного блока
Это мой блок тест без резьбы:
[TestMethod]
public void FromLocalPoints()
{
var projectedCoordinates = this.ConvertFromLocalPoints();
foreach (var projectedCoordinate in projectedCoordinates)
{
Debug.Write(projectedCoordinate.X);
Debug.Write("; ");
Debug.WriteLine(projectedCoordinate.Y);
}
}
this.ConvertFromLocalPoints() вызывает фактический метод, который я хочу, чтобы проверить.
Я создал делегат, событие и обработчик:
public delegate void ReprojectCompleteHandler(IEnumerable<Coordinate> projectedCoordinates);
public event ReprojectCompleteHandler ReprojectCompleteEvent;
private void ReprojectHandler(IEnumerable<Coordinate> projectedCoordinates)
{
Debug.WriteLine("Conversion is complete");
}
В моей TestSetup я слушаю мое событие:
[TestInitialize]
public void TestSetup()
{
this.ReprojectCompleteEvent += this.ReprojectHandler;
}
Мой блок тест является:
[TestMethod]
public void FromLocalPointsThreaded()
{
// Call FromLocalPoints multiple times in separate threads to check if it is thread safe
for (var i = 0; i < 10; i++)
{
var myThread = new Thread(this.ConvertFromLocalPointsThreaded);
}
Debug.WriteLine("FromLocalPointsThreaded is done");
}
private void ConvertFromLocalPointsThreaded()
{
var projectedCoordinates = this.ConvertFromLocalPoints();
// Send result to delegate/event:
if (this.ReprojectCompleteEvent != null)
{
this.ReprojectCompleteEvent(projectedCoordinates);
}
}
Когда я запускаю этот модульный тест, я получаю сообщение «FromLocalPointsThreaded is done» в моем выпуске, но «Конверсия не завершена».
Что мне не хватает, чтобы получить эту работу? Или я должен использовать другой подход?
Обновление В настоящее время мы переводим библиотеки, которые выполняют фактическое преобразование. Старая библиотека не является потокобезопасной, поэтому мы добавили блокировки. Новая библиотека должна быть потокобезопасной, поэтому я хочу удалить блокировки. Но мне нужен единичный тест, который докажет, что наш метод с использованием новой библиотеки действительно потокобезопасен.
Нет ничего, что говорит основному потоку ждать появления порожденных потоков. Он просто выходит, прежде чем они начнут работать. Посмотрите на Thread.Join. – mrmcgreg
Нет, где в вашем коде вы фактически _start_ нити – MickyD
В дополнение к ответам выше (как mrmcgreg's, так и Micky Duncan's), если вы хотите измерить производительность вашего кода в параллельной среде, вы можете начать свои потоковые функции в один заход. См. [Мой ответ по другому вопросу] (http://stackoverflow.com/a/30568340/2144232) на hpw, это можно сделать на C#. – mg30rg