在多线程应用程序中使用类变量是不是很糟糕?

时间:2009-04-30 18:08:29

标签: c# multithreading variables

我继承了一个需要mutithreaded的项目。在工作线程中有三个主要的类。

BASE CLASS - 具有类级别SqlDataAdapter和DataTable。 INHERITED CLASS ONE - 使用继承的SqlDataAdapter和DataTable。 INHERITED CLASS TWO - 使用继承的SqlDataAdapter和DataTable。

每个东西都可以工作,但我只有两个用户同时进行测试。

让SqlDataAdapter和DataTable成为类级变量是个坏主意吗?

更新 对不起,这是一个SqlDataAdapter而不是SqlTableAdapter。语言是C#。 SqlDataAdapter和DataTable来自System.Data.SqlClient命名空间。

以下是一些基类:

public abstract class BaseSync
{
    #region Variables
    internal SqlDataAdapter stageDataAdapter;
    internal DataTable stageDataTable;
    #endregion //Variables
}

第二部分

还有一个单例实用程序类,所有派生类都使用它。我不知道它是否会引起问题。它看起来像这样:

public class Utility
{ 
    private static readonly Utility _utility= new Utility();

    private Utility()
    { }

    public static Utility GetUtility()
    {
        return _utility;
    }

    public int GetAutoNumber(string tablename, string fieldname, string siteId)
    {
        string _tablename = tablename;
        string _fieldname = fieldname;
        ...
    }

    internal MissingInfo NormalizeRow(DataRow dataRow)
    {

        MissingInfo retVal = MissingInfo.None;

        //Num
        if (dataRow["Num"] == DBNull.Value)
        {
           retVal =MissingInfo.Num;
           dataRow["Num"] = 1;
        }
        ...
    }
}

4 个答案:

答案 0 :(得分:3)

这取决于对象的访问级别。只要它们不是静态的(在VB.NET中共享)。只要每个线程都有自己的对象实例,你就可以在对象中使用它们。

在有趣的情况下,使用在所有实例中共享的静态成员。

所以它的长短是我们需要看代码。

答案 1 :(得分:2)

由不同的线程修改变量而不进行同步化总是非常糟糕的主意

你没有提到是否是这种情况。如果你是线程,你需要计划和检查你在做什么。

答案 2 :(得分:2)

关于变量的规则是,它们可能发生变化的地方越多,竞争条件的可能性就越大,尤其是在应用程序发展的情况下。

您的问题没有太多信息,因此很难提供具体答案。类级变量(如果是公共的)通常可以被视为全局变量,因此可以从任何地方访问,从而增加了腐败的风险。

一种可能的方法可能是隐藏这些字段并通过类级函数提供访问权限。然后,您可以执行更多操作,因为您已创建了对这些变量的特定访问点。您需要小心确保您永远不会向应用程序提供对该对象的直接和可变引用,这可能需要重写,但它会使您的程序更安全。

答案 3 :(得分:1)

你应该总是考虑在多线程中共享非常量对象时进行同步,否则你有一天会搞砸......

所以,如果你想把它变成一个类变量就行了,但是记得为它做一些锁机制。