0

我正在尝试使用这个很棒的项目,但是由于我需要扫描许多图像,因此该过程需要很多时间,因此我正在考虑对其进行多线程处理。
但是,由于对图像进行实际处理的类使用并由我Static methods进行操作,因此我不确定如何正确处理。我从主线程调用的方法是:Objectsref

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, ...);
                });

我花了几个小时调试它,大部分时间我得到的结果都是正确的,但我确实遇到了几个我现在似乎无法重现的错误。

编辑
我将类的代码粘贴到这里: http: //pastebin.com/UeE6qBHx

4

2 回答 2

1

我很确定它是线程安全的。有两个字段,是配置字段,类内部没有修改。所以基本上这个类没有状态,所有计算都没有副作用(除非我没有看到非常模糊的东西)。

这里不需要 Ref 修饰符,因为引用没有被修改。

于 2013-05-21T19:54:14.153 回答
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");
    }
}
于 2013-05-21T19:30:30.343 回答