在c#中从线程调用静态方法
本文关键字:调用 静态方法 线程 | 更新日期: 2023-09-27 18:14:36
我正在尝试使用这个伟大的项目,但由于我需要扫描许多图像的过程需要很多时间,所以我正在考虑多线程。
然而,由于类,使图像的实际处理使用Static methods
,并通过ref
操纵Objects
,我真的不知道如何做到这一点。我从主线程调用的方法是:
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
我很确定它是线程安全的。有两个字段,它们是配置字段,不能在类中修改。所以基本上这个类没有状态所有的计算都没有副作用(除非我没有看到非常模糊的东西)。
这里不需要Ref修饰符,因为引用没有被修改。
除非您知道它是在局部变量中还是在字段中(在静态类中,而不是在方法中)存储值,否则无法判断。
所有的局部变量都可以在每次调用时实例化,但字段不会。
一个非常糟糕的例子:
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");
}
}