2016-05-31 31 views
0

我想知道我的方法是否可以跨多個表單使用方法是安全的,或者如果我的方法可能存在問題,我不知道。關於在c#WinForms中使用多種表單可用的方法的問題

我目前正在研究一個有十幾種形式的應用程序,並且有許多這些形式被調用的某些方法,所以在每個表單上改爲或重新創建它們,我創建了一個名爲Globals.cs的新類,我創建了一系列我在整個應用程序中調用的類和方法。

我還沒有注意到我的設置有任何問題,但我擔心的是,如果我的Globals.cs中的一個方法會被不同的窗體同時調用,會發生什麼?我有無效的方法,寫入數據傳遞給SQL表,我有方法返回數據。

我以某種形式使用BackGroundWorkers,如果其中一個方法被兩個不同的Worker同時調用,或者通過Worker和另一個表單上的方法調用,會發生什麼?

這裏是我的Globals.cs類和一些裏面的方法的示例。

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

不確定你遵循什麼標準和命名約定。我建議你重命名你的一些方法和類,如下所示:'GetUserSetting'' SaveUserSetting'' GetEnvironment'' ColorPropertyFromString''Connection'。 – HappyCoding

回答

1
  1. 在單獨的類中使用全局方法或屬性沒有一般問題。這是非常普遍的。

  2. 一般而言,您不需要擔心表單一次執行兩件事情。除非您已經完成了非常特定的(和困難的)事情,否則每個表單的事件(點擊次數,按鍵次數等)全部由整個應用程序中的單個UI線程處理。即使您使用(討厭)DoEvents方法,情況也是如此。

  3. 如果你這樣做來分隔工作線程UI線程(這是常見的,通常是一個好主意),你可以防止你的全局函數同時訪問通過一個簡單的lock,一個更高級的工作critical section,或者使用特定的CLR功能,這取決於您在做什麼(例如,您可以使用Application.Lock鎖定應用程序變量)。

  4. 很多很多CLR函數都是線程安全的,如果是的話,可以調用它們而不用擔心鎖定。有關CLR功能,請參閱MSDN文檔; 99%的時間他們會告訴你函數是否是線程安全的。

1

原則上,具有全局函數是好的。你需要考慮一個函數是否可能被多個線程同時調用,以及這是否有害。在另一個線程更新它時讀取一個線程中的值就是一個例子。做一些閱讀,讓代碼線程安全。

+1

查看https://msdn.microsoft.com/en-us/library/mt679037.aspx – Ian

+0

感謝您的鏈接,那麼具有輸入參數的方法如何,分析這些參數並返回結果。當像這樣的方法被多個線程同時調用時會發生什麼?線程2是否會得到線程1傳入的結果,還是會創建一個方法的實例,其中每個線程都得到自己的結果? – Cornelius

+1

@Cornelius:如果方法(函數)不修改任何全局變量/對象,它們就沒有問題。一個函數可以被任意數量的併發線程調用,因爲它的執行是在該特定線程中完成的。我想你可以說它創建了一個函數的實例,是的。 –