Определение параметризованного метода для задач в C # - PullRequest
0 голосов
/ 04 мая 2018

Я программирую на 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, но я не знаю, как это исправить.

...