C# 在多线程应用程序中使用类变量是否不好?

C# 在多线程应用程序中使用类变量是否不好?,c#,multithreading,variables,C#,Multithreading,Variables,我继承了一个需要多线程的项目。工作线程中使用了三个主要类 基类-具有类级别的SqlDataAdapter和DataTable。 继承的类1-使用继承的SqlDataAdapter和DataTable。 继承的类2-使用继承的SqlDataAdapter和DataTable 每件事都很正常,但我只有两个用户同时测试 让SqlDataAdapter和DataTable成为类级变量是个坏主意吗 更新 抱歉,这是SqlDataAdapter,不是SqlTableAdapter。语言是C#。SqlData

我继承了一个需要多线程的项目。工作线程中使用了三个主要类

基类-具有类级别的SqlDataAdapter和DataTable。 继承的类1-使用继承的SqlDataAdapter和DataTable。 继承的类2-使用继承的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;
        }
        ...
    }
}

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

您遇到的有趣情况是使用在所有实例中共享的静态成员


因此,它的长短是我们需要查看代码。

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

您遇到的有趣情况是使用在所有实例中共享的静态成员


因此,长话短说就是我们需要查看代码。

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


但你没有提到这是不是真的。如果你是线程,你需要计划和检查你在做什么

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


但你没有提到这是不是真的。如果你是线程,你需要计划和检查你在做什么

> P>在多线程中共享非常量对象时,应始终考虑同步,否则有一天会被终止…


< P> >,如果你想使它成为类变量,那就好了,但是记住要为它做一些锁机制。

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


所以,如果你想把它变成一个类变量,那也没关系,但是记住要为它设置一些锁机制。

关于变量的规则是,变量可能改变的地方越多,竞争条件的可能性就越大,特别是在应用程序发展的情况下

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


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

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

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


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

如果不了解线程安全或SQLTableAadaptor和DataTable,这是不可能的。@NitroxDM,也许只是我,但您在问题中提到您使用的语言了吗?SQLTableAdapter是VB.Net、C#或其他语言的一个特性吗?语言可能会对答案产生影响。如果不了解线程安全或SqlTableAAAdaptor和DataTable,就不可能这么说。@NitroxDM,也许只是我,但您在问题中提到您使用的语言了吗?SQLTableAdapter是VB.Net、C#或其他语言的一个特性吗?语言可能会对答案产生影响。