2011-07-16 60 views
1

我想讓我的事情更清楚地瞭解如何在多線程應用程序中使用類的實例:
我可以在不同線程中使用同一個類的實例嗎?換句話說,可以在不同的線程中創建同一類的實例嗎?在不同線程中使用一個類的實例

例如:
我有一個類DbConnectionHelper它得到一個連接字符串中的默認構造函數和使用公共財產進行連接字符串可見:

public class DbConnectionHelper 
{ 
    string connstring; 

    public DbConnectionHelper() 
    { 
     string userconnstring = Settings.Default.ConnectionString; 
     connstring = GetConnectionString(userconnstring); 
     ... 
    } 

    public string ConnString 
    { 
     get 
     { 
      return connstring; 
     } 
     set 
     { 
      connstring = value; 
     } 
    } 
    ... 

然後,我有一些倉庫類它使用實體框架從數據庫獲取數據。其中一些存儲庫類在UI線程中有實例,其中一些在其他線程(而不是UI)中。

所有這些存儲庫類都可以通過創建一個類DbConnectionHelper的實例並讀取它的ConnString屬性來獲取連接字符串嗎?同一類的

DBConnectionHelper connhelper = new DBConnectionHelper(); 
string conn = connhelper.ConnString; 
+1

簡單的回答:是的。類/對象和線程之間沒有關係。只有代碼在線程上執行。 –

回答

3

單獨的實例是獨立的和不共享共同的數據,除非它們都具有一個依賴於到公共對象(如在類或一個靜態變量到另一對象,它是一個參考對於所有或至少一些情況相同)。

在你的情況下,這根本不是問題 - 你每次需要時都會創建一個DBConnectionHelper類的獨立實例,並僅用它來構建連接字符串。你只需要擔心線程安全,如果多線程嘗試和訪問方法的共享對象

2

是的,您可以在單獨的線程中創建單獨的類的實例,而不會有任何問題。如果您訪問來自不同線程的靜態類/成員,或者在線程之間共享類的實例,情況會變得更加複雜,但是您所做的事情是完全安全的。

在附註中,您可能希望避免從UI線程加載實體框架實體,因爲在從數據庫加載實體時,UI將無響應。這將是使用後臺工作線程或Task的好時機。

相關問題