멀티 스레드 앱에서 클래스 변수를 사용하는 것이 좋지 않습니까?
-
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이없는 다른 스레드에 의해 변수를 수정하는 것은 항상 정말 나쁜 생각.
그래도 이것이 사실인지 언급하지 않습니다. 스레드가 있으면 계획하고 무엇을하고 있는지 확인해야합니다.
변수에 대한 규칙은 잠재적으로 변화 할 수있는 장소가 많을수록 특히 응용 프로그램이 진화하는 경우 인종 조건이 더 많을 수 있다는 것입니다.
귀하의 질문에는 많은 정보가 없으므로 특정 답변을 제공하기가 어렵습니다. 클래스 수준 변수 (공개 인 경우)는 종종 글로벌 변수처럼 취급 될 수 있으므로 모든 곳에서 접근 할 수있어 부패의 위험이 높아집니다.
가능한 접근 방식은 이러한 필드를 숨기고 클래스 수준 기능을 통해 액세스를 제공하는 것입니다. 그런 다음 이러한 변수에 대한 특정 액세스 지점을 만들었 기 때문에 더 많은 작업을 수행 할 수 있습니다. 응용 프로그램에 해당 객체에 대한 직접적이고 변이 가능한 참조를 제공하지 않도록 조심해야합니다.이 객체는 일부 재 작성이 필요할 수 있지만 프로그램을 더 안전하게 만들 수 있습니다.
당신은 멀티 스레드에서 비정상적인 객체를 공유 할 때 항상 동기화를 고려해야합니다. 그렇지 않으면 언젠가 망쳐 놓을 것입니다 ...
따라서 클래스 변수로 만들려면 괜찮지 만 잠금 메커니즘을 만들어야합니다.