Я программирую на C #. Я хочу запустить 3 метода, используя «Задача». Я пишу свои коды, как показано ниже:
public void ExtractLicensePlate()
{
var tasks = new Task<List<RotatedRect>>[3];
tasks[0] =
new Task<List<RotatedRect>>(ExtractLicensePlateUsingSimpleCanny);
tasks[1] =
new Task<List<RotatedRect>>(ExtractLicensePlateUsingMorphology);
tasks[2] =
new Task<List<RotatedRect>>(ExtractLicensePlateUsingSobel);
for (var i = 0; i < tasks.Length; i++)
tasks[i].Start();
ExtractedRotatedRectangles =
tasks[0].Result
.Concat(tasks[1].Result)
.Concat(tasks[2].Result).ToList();
}
Кажется, что эти коды работают правильно. В ExtractLicensePlateUsingSimpleCanny
и ExtractLicensePlateUsingMorphology
две строки кодов повторяются, как написано ниже:
private List<RotatedRect> ExtractLicensePlateUsingSimpleCanny()
{
UMat edgeImage = new UMat();
CvInvoke.Canny(Input, edgeImage, CannyThreshold, CannyLinking);
//some codes...
}
private List<RotatedRect> ExtractLicensePlateUsingMorphology()
{
UMat edgeImage = new UMat();
CvInvoke.Canny(Input, edgeImage, CannyThreshold, CannyLinking);
//some codes...
}
Я хочу изменить две функции, как показано ниже, чтобы вычислить edgeImage
один раз, поэтому я использую параметр для каждого метода:
private List<RotatedRect> ExtractLicensePlateUsingSimpleCanny(UMat edgeImage)
{
//some codes...
}
private List<RotatedRect> ExtractLicensePlateUsingMorphology(UMat edgeImage)
{
//some codes...
}
Теперь, когда я использую их в своем коде, как показано ниже, я вижу неожиданные результаты:
public void ExtractLicensePlate()
{
var edgeImage = new UMat();
CvInvoke.Canny(Input, edgeImage, CannyThreshold, CannyLinking);
var tasks = new Task<List<RotatedRect>>[3];
tasks[0] =
new Task<List<RotatedRect>>(() => ExtractLicensePlateUsingSimpleCanny(edgeImage));
tasks[1] =
new Task<List<RotatedRect>>(() => ExtractLicensePlateUsingMorphology(edgeImage));
tasks[2] =
new Task<List<RotatedRect>>(ExtractLicensePlateUsingSobel);
for (var i = 0; i < tasks.Length; i++)
tasks[i].Start();
ExtractedRotatedRectangles =
tasks[0].Result
.Concat(tasks[1].Result)
.Concat(tasks[2].Result).ToList();
}
Как я могу это исправить?
Следует отметить, что я также использую .Clone()
для edgeImage
и Task.WaitAll(tasks)
, но я все еще вижу неожиданные результаты. Я новичок в Task
, кажется, что это race condition
, но я не знаю, как это исправить.