2013-05-21 5 views
0

Я пытаюсь использовать this great project, но так как мне нужно сканировать много изображений, процесс занимает много времени, поэтому я думал о многопоточности.
Однако, поскольку класс, который делает фактическую обработку изображений, использует Static methods и манипулирует Objects от ref. Я не уверен, как это сделать правильно. метод, который я называю из моего основного потока:Вызов статических методов из потока в C#

public static void ScanPage(ref System.Collections.ArrayList CodesRead, Bitmap bmp, int numscans, ScanDirection direction, BarcodeType types) 
{ 
    //added only the signature, actual class has over 1000 rows 
    //inside this function there are calls to other 
    //static functions that makes some image processing 
} 

Моего вопрос, если это безопасно использовать использовать эту функцию, как это:

List<string> filePaths = new List<string>(); 
     Parallel.For(0, filePaths.Count, a => 
       { 
        ArrayList al = new ArrayList(); 
        BarcodeImaging.ScanPage(ref al, ...); 
       }); 

Я провел часы отладки это, и большинство из время, которое я получил, было правильным, но я столкнулся с несколькими ошибками, которые я сейчас не могу воспроизвести.

EDIT
Я вставил код класса здесь: http://pastebin.com/UeE6qBHx

+2

без анализа самого метода никто не может сказать, является ли он потокобезопасным! – Yahia

+1

Тот факт, что «большой проект» по-прежнему использует устаревший класс «ArrayList», заставляет меня беспокоиться о безопасности потока. –

+0

Если используется глобальная переменная (или переменная, не используемая как параметр или внутри функции), то это нет. –

ответ

0

Там нет никакого способа, чтобы говорить, если вы не знаете, если он хранит значения в локальных переменных или в поле (в статическом классе, не метод).

Все локальные переменные будут точными и запрограммированными для каждого вызова, но поля не будут.

Очень плохой пример:

public static class TestClass 
{ 
    public static double Data; 
    public static string StringData = ""; 

    // Can, and will quite often, return wrong values. 
    // for example returning the result of f(8) instead of f(5) 
    // if Data is changed before StringData is calculated. 
    public static string ChangeStaticVariables(int x) 
    { 
     Data = Math.Sqrt(x) + Math.Sqrt(x); 
     StringData = Data.ToString("0.000"); 
     return StringData; 
    } 

    // Won't return the wrong values, as the variables 
    // can't be changed by other threads. 
    public static string NonStaticVariables(int x) 
    { 
     var tData = Math.Sqrt(x) + Math.Sqrt(x); 
     return Data.ToString("0.000"); 
    } 
} 
1

Я уверен, что это поточно. Существует два поля, которые являются полями конфигурации и не изменяются внутри класса. Таким образом, в основном этот класс не имеет состояния, и все вычисления не имеют побочных эффектов. (Если я не вижу что-то очень неясное).

Редактор ссылок здесь не требуется, поскольку ссылка не изменяется.

Смежные вопросы