Frage

erbte ich ein Projekt, das zu mutithreaded muss. Es gibt drei Hauptklassen, die in den Arbeitsthreads zu gewöhnen.

BASE CLASS - hat eine Klassenstufe SqlDataAdapter und Datatable. Vererbten Klasse ONE - Verwendet die geerbte SqlDataAdapter und Datatable. Vererbten Klasse TWO -. Nutzt die geerbte SqlDataAdapter und Datatable

Jedes Ding Nähte zu arbeiten, aber ich habe nur zwei Benutzer Tests zur gleichen Zeit.

Ist mit dem SqlDataAdapter und Datatable sei Klassenstufe Variablen eine schlechte Idee?

Aktualisieren Leider ist es ein SqlDataAdapter kein SqlTableAdapter. Die Sprache ist C #. Die SqlDataAdapter und Datentabelle sind aus dem System.Data.SqlClient-Namespace.

Hier finden Sie einige der Basisklasse:

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

Part Two

Es gibt auch eine Singleton Utility-Klasse, die alle abgeleiteten Klassen verwenden. Ich weiß nicht, wenn es zu Problemen führen wird oder nicht. Es sieht wie folgt aus:

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;
        }
        ...
    }
}
War es hilfreich?

Lösung

Dies ist abhängig von der Zugriffsebene der Objekte. Solange sie nicht statisch ist (in VB.NET gemeinsam). Sie sollten sie in dem Objekt sein, fein, solange jeden Thread, hat seine eigene Instanz des Objekts.

Wo Sie in interessanten Situationen kommen, sind mit den statischen Elemente, die in allen Instanzen gemeinsam genutzt werden.

So ist die lange und kurze davon ist, dass wir den Code sehen müssten.

Andere Tipps

Variablen geändert durch verschiedene Threads ohne syncronization zu haben, ist immer eine wirklich schlechte Idee .

Sie erwähnen nicht, ob dies allerdings der Fall ist. Wenn Sie fädeln, müssen Sie planen und zu überprüfen, was Sie tun.

Die Regel über Variablen ist, dass die mehr Orte, die sie möglicherweise von ändern könnte, desto mehr Chancen gibt der Rennbedingungen, vor allem, wenn die Anwendung entwickelt.

Es gibt nicht viel Informtionen in Frage, so dass es schwierig ist, eine bestimmte Antwort zu geben. Klasse-Ebene Variablen (wenn öffentlich) können oft wie globale Variablen behandelt werden und sind somit von überall, um das Risiko von Korruption zu erhöhen.

Ein möglicher Ansatz könnte sein, diese Felder zu verstecken und auf den Zugriff über Klasse-Level-Funktionen zur Verfügung stellen. Anschließend können Sie mehr Dinge tun, weil Sie bestimmte Punkte des Zugangs zu diesen Variablen erstellt haben. Sie müßten vorsichtig sein, um sicherzustellen, dass Sie nie Anwendungen einen direkten und wandelbar Verweise auf dieses Objekt geben, das einige Neuschreiben erfordern, aber es würde Ihr Programm sicherer machen.

Sie sollten immer tun Synchronisation berücksichtigen, wenn nicht konstante Objekte in Multi-Thread-Sharing, sonst wirst du einen Tag vermasselt Ende ...

so, es ist in Ordnung, wenn Sie es eine Klassenvariable machen wollen, aber denken Sie daran eine Verriegelungsmechanismus für sie zu machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top