Pergunta

Eu herdei um projeto que precisa ser mutithreaded. Há três classes principais que são utilizados nos segmentos de trabalho.

BASE CLASS - tem um SqlDataAdapter nível de classe e DataTable. Classe herdada ONE - Usa o SqlDataAdapter herdado e DataTable. HERDADA CLASSE DOIS -. Usa o SqlDataAdapter e DataTable herdou

Cada coisa costuras para trabalhar, mas eu só tenho dois usuários de teste ao mesmo tempo.

É ter o SqlDataAdapter e DataTable ser variáveis ??nível de classe uma má idéia?

Atualizar Desculpe é um SqlDataAdapter não um SqlTableAdapter. A linguagem é C #. O SqlDataAdapter e DataTable são do namespace System.Data.SqlClient.

Aqui você encontra a classe base:

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

Segunda Parte

Há também uma classe de utilitário singleton que todas as classes derivadas usar. Eu não sei se ele vai causar problemas ou não. Parece que este:

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;
        }
        ...
    }
}
Foi útil?

Solução

Isso depende do nível de acesso dos objetos. Enquanto eles não são estáticos (Shared em VB.NET). Você deve estar bem tê-los no objeto, enquanto cada thread, tem sua própria instância do objeto.

Onde você entrar em situações interessantes estão com os membros estáticos que são compartilhados entre todas as instâncias.

Assim, a longo e curto do que é que seria necessário para ver o código.

Outras dicas

Tendo variáveis ??modificados por diferentes tópicos sem sincronização é sempre um péssima idéia .

Você não menciona se este é o caso, porém. Se você passe, você precisa planejar e verificar o que está fazendo.

A regra sobre variáveis ??é que quanto mais lugares que eles poderiam mudar de, mais chances existem de condições de corrida, especialmente se o evolui de aplicação.

Não há muito informtion na sua pergunta por isso é difícil dar uma resposta específica. variáveis ??de nível de classe (se pública) pode muitas vezes ser tratados como variáveis ??globais e são, portanto, acessível a partir de todos os lugares, aumentando o risco de corrupção.

Uma abordagem possível seria a esconder estes campos e em fornecer acesso através de funções de nível de classe. Você pode, então, fazer mais coisas, porque você criou pontos específicos de acesso a essas variáveis. Você precisaria ter cuidado para garantir que você nunca está dando aplicações de referências diretas e mutáveis ??para esse objeto, que pode exigir alguma reescrita, mas faria o seu programa mais seguro.

Você deve sempre considerar fazer a sincronização quando compartilhamento de objetos não-constantes em multi-thread, caso contrário você vai acabar asneira um dia ...

Então, é OK se você quiser torná-lo uma variável de classe, mas lembre-se de fazer algum mecanismo de bloqueio para ele.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top