2016-05-31 9 views
0

Ich würde gerne wissen, ob meine Methode, Methoden über mehrere Formulare hinweg verfügbar zu machen, sicher ist oder ob ich Probleme mit meinem Ansatz habe.Bedenken, Methoden in mehreren Formularen in C# WinForms verfügbar zu machen

Ich arbeite derzeit an einer Anwendung mit über einem Dutzend Formulare, und es gibt bestimmte Methoden, die von vielen dieser Formulare aufgerufen werden, so dass ich stattdessen eine neue Klasse mit dem Namen Globals.cs und in diesem erstellt Klasse Ich erstelle eine Reihe von Klassen und Methoden, die ich in meiner gesamten Anwendung anrufe.

Ich habe bis jetzt keine Probleme mit meiner Einrichtung bemerkt, aber meine Sorge ist, was passiert, wenn eine meiner Methoden innerhalb meiner Globals.cs gleichzeitig von verschiedenen Formen aufgerufen würde? Ich habe void-Methoden, die Daten an SQL-Tabellen übergeben und ich habe Methoden, die Daten zurückgeben.

Ich verwende BackGroundWorkers in einigen Formen, was würde passieren, wenn eine dieser Methoden gleichzeitig von zwei verschiedenen Workern oder von einem Worker und einem Methodenaufruf auf einer anderen Form aufgerufen würde?

Hier ist ein Beispiel meiner Klasse Globals.cs und ein paar der Methoden im Inneren.

class Globals 
{ 
    public static string getUserSetting(string userID, string form, string obj_name) 
    { 
     string value = ""; 
      // Get setting value from SQL Table and assign it to return variable 
     return value; 
    } 

    public static void saveUserSetting(string userID, string form, string obj_name, string value) 
    { 
     // Save Passed in settings to SQL Table 
    } 

    public static string getEnviro() 
    { 
     if (!string.IsNullOrEmpty(Settings.Default.EnvironmentDefault)) 
      return Settings.Default.EnvironmentDefault.ToString(); 
     else 
      return "Live"; 
    } 

    public class Properties 
    { 
     public static System.Drawing.Color colorPropertyFromString(string stringValue) 
     { 
      System.Drawing.Color returnValue = System.Drawing.Color.Empty; 
      if (!string.IsNullOrEmpty(stringValue)) 
      { 
       int colorIntVal = -1; 
       bool output; 
       output = int.TryParse(stringValue, out colorIntVal); 

       returnValue = System.Drawing.Color.FromArgb(colorIntVal); 
      } 
      return returnValue; 
     } 
    } 
} 


/* 
    I use this Class to create new instances of SqlConnections through my application. 
    Example: If I need a new SqlConnection I would go: 
    SqlConnection conn = new SqlConnection(Conn.ConnectionString); 
*/ 
public sealed class Conn 
{ 
    public static string ConnectionString = Settings.Default.ArborgConnectionString.ToString(); 
} 
+1

Nicht sicher, welche Standards und Namenskonventionen Sie befolgen. Es ist meine Empfehlung, dass Sie einige Ihrer Methoden und Klassen wie folgt umbenennen: 'GetUserSetting'' SaveUserSetting' 'GetEnvironment'' ColorPropertyFromString' 'Connection'. – HappyCoding

Antwort

1
  1. Es gibt kein generelles Problem mit globalen Methoden oder Eigenschaften in einer separaten Klasse. Dies ist sehr häufig.

  2. Im Allgemeinen müssen Sie sich keine Gedanken über Formulare machen, die gleichzeitig zwei Dinge tun. Sofern Sie nicht etwas sehr Spezifisches (und Schwieriges) getan haben, werden die Ereignisse (Klicks, Tastendrücke usw.) jedes Formulars von einem einzigen UI-Thread in Ihrer gesamten Anwendung behandelt. Dies gilt auch dann, wenn Sie die (böse) Methode DoEvents verwenden.

  3. Wenn Sie die Arbeit getan haben, um den UI-Thread von Worker-Threads zu trennen (dies ist üblich und ist in der Regel eine gute Idee), können Sie den simultanen Zugriff auf Ihre globalen Funktionen mit einem einfachen lock verhindern critical section oder durch die Verwendung bestimmter CLR-Funktionen, die davon abhängen, was Sie tun (z. B. können Sie Anwendungsvariablen mit Application.Lock sperren).

  4. Viele, viele CLR-Funktionen sind Thread-sicher, und wenn sie sind, können Sie sie anrufen, ohne sich um Sperren kümmern zu müssen. Informationen zur CLR-Funktion finden Sie in der MSDN-Dokumentation. In 99% der Fälle werden sie Ihnen sagen, ob die Funktion Thread-sicher ist.

1

Im Prinzip ist die globale Funktion in Ordnung. Sie müssen überlegen, ob es möglich ist, dass eine Funktion gleichzeitig von mehr als einem Thread aufgerufen wird und ob dies schädlich sein könnte. Einen Wert in einem Thread zu lesen, während ein anderer es aktualisiert, ist ein Beispiel. Lesen Sie etwas darüber, wie Sie Code-Threads sicher machen können.

+1

Schauen Sie auf https://msdn.microsoft.com/en-us/library/mt679037.aspx – Ian

+0

Vielen Dank für den Link, was ist mit einer Methode, die Parameter eingegeben hat, analysiert diese Parameter und gibt ein Ergebnis zurück. Was passiert, wenn eine Methode wie diese gleichzeitig von mehr als einem Thread aufgerufen wird? Würde Thread 2 die Ergebnisse erhalten, die Thread 1 übergeben hat, oder erstellt er eine Instanz der Methode, bei der jeder Thread seine eigenen Ergebnisse zurückbekommt? – Cornelius

+1

@Cornelius: Wenn die Methoden (Funktionen) keine globalen Variablen/Objekte verändern, sind sie in Ordnung.Eine Funktion kann von einer beliebigen Anzahl gleichzeitiger Threads aufgerufen werden, da die Ausführung in diesem spezifischen Thread erfolgt. Ich denke, man könnte sagen, dass es eine Instanz der Funktion erstellt, ja. –

Verwandte Themen