멀티 스레드 앱에서 클래스 변수를 사용하는 것이 좋지 않습니까?

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

  •  03-07-2019
  •  | 
  •  

문제

나는 mutithreaded가 필요한 프로젝트를 물려 받았습니다. 작업자 스레드에 사용되는 세 가지 주요 클래스가 있습니다.

기본 클래스 - 클래스 레벨 SQLDATAADAPTER 및 DATATABLE이 있습니다. 상속 클래스 1- 상속 된 SQLDATAADAPTER 및 DATATABLE을 사용합니다. 상속 클래스 2- 상속 된 SQLDATAADAPTER 및 DATATABLE을 사용합니다.

모든 것이 일하기 위해 이음새가 있지만 동시에 두 명의 사용자가 테스트합니다.

sqldataadapter와 datatable이 클래스 레벨 변수가 나쁜 아이디어입니까?

업데이트죄송합니다. SQLDataAdapter가 아닌 SQLDataAdapter입니다. 언어는 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에서 공유). 각 스레드가 객체의 자체 인스턴스를 가지고있는 한 객체에있는 것이 좋습니다.

흥미로운 상황에 오는 곳은 모든 인스턴스에서 공유되는 정적 멤버와 함께 있습니다.

따라서 길고 짧은 것은 코드를 볼 필요가 있다는 것입니다.

다른 팁

Syncronization이없는 다른 스레드에 의해 변수를 수정하는 것은 항상 정말 나쁜 생각.

그래도 이것이 사실인지 언급하지 않습니다. 스레드가 있으면 계획하고 무엇을하고 있는지 확인해야합니다.

변수에 대한 규칙은 잠재적으로 변화 할 수있는 장소가 많을수록 특히 응용 프로그램이 진화하는 경우 인종 조건이 더 많을 수 있다는 것입니다.

귀하의 질문에는 많은 정보가 없으므로 특정 답변을 제공하기가 어렵습니다. 클래스 수준 변수 (공개 인 경우)는 종종 글로벌 변수처럼 취급 될 수 있으므로 모든 곳에서 접근 할 수있어 부패의 위험이 높아집니다.

가능한 접근 방식은 이러한 필드를 숨기고 클래스 수준 기능을 통해 액세스를 제공하는 것입니다. 그런 다음 이러한 변수에 대한 특정 액세스 지점을 만들었 기 때문에 더 많은 작업을 수행 할 수 있습니다. 응용 프로그램에 해당 객체에 대한 직접적이고 변이 가능한 참조를 제공하지 않도록 조심해야합니다.이 객체는 일부 재 작성이 필요할 수 있지만 프로그램을 더 안전하게 만들 수 있습니다.

당신은 멀티 스레드에서 비정상적인 객체를 공유 할 때 항상 동기화를 고려해야합니다. 그렇지 않으면 언젠가 망쳐 놓을 것입니다 ...

따라서 클래스 변수로 만들려면 괜찮지 만 잠금 메커니즘을 만들어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top