Плохо ли использовать переменные класса в многопоточном приложении?

StackOverflow https://stackoverflow.com/questions/808301

  •  03-07-2019
  •  | 
  •  

Вопрос

Я унаследовал проект, который должен быть многопоточным.Существует три основных класса, которые используются в рабочих потоках.

БАЗОВЫЙ КЛАСС — имеет уровни классов SqlDataAdapter и DataTable.НАСЛЕДОВАННЫЙ КЛАСС ОДИН — использует унаследованный SqlDataAdapter и DataTable.НАСЛЕДОВАННЫЙ КЛАСС ВТОРОЙ — использует унаследованный 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
}

Часть вторая

Существует также служебный класс Singleton, который используют все производные классы.Не знаю, вызовет ли это проблемы или нет.Это выглядит так:

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).У вас должно быть все в порядке, если они есть в объекте, если каждый поток имеет свой собственный экземпляр объекта.

Интересные ситуации возникают со статическими членами, которые являются общими для всех экземпляров.

Короче говоря, нам нужно будет увидеть код.

Другие советы

Изменение переменных разными потоками без синхронизации всегда является проблемой. действительно плохая идея.

Однако вы не упомянули, так ли это.Если вы занимаетесь тредами, вам нужно планировать и проверять, что вы делаете.

Правило в отношении переменных заключается в том, что чем больше мест, из которых они потенциально могут измениться, тем больше вероятность возникновения состояний гонки, особенно если приложение развивается.

В вашем вопросе мало информации, поэтому сложно дать конкретный ответ.Переменные уровня класса (если они общедоступны) часто можно рассматривать как глобальные переменные и, таким образом, они доступны отовсюду, что повышает риск коррупции.

Возможным подходом может быть скрытие этих полей и предоставление доступа через функции уровня класса.После этого вы сможете делать больше вещей, поскольку создали определенные точки доступа к этим переменным.Вам нужно быть осторожным и никогда не предоставлять приложениям прямые и изменяемые ссылки на этот объект, что может потребовать некоторой переписывания, но сделает вашу программу более безопасной.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top