在不同的线程中使用一个类的实例

时间:2011-07-16 16:29:26

标签: c# multithreading

我想让我更清楚地了解在多线程应用程序中使用类的实例:
我可以在不同的线程中使用同一个类的实例吗?换句话说,我可以在不同的线程中创建同一个类的实例吗?

例如:
我有一个类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;
        }
    }
  ...

然后我有许多存储库类,它们使用Entity Framework从数据库中获取数据。其中一些存储库类在UI线程中有实例,其中一些在其他线程(不是UI)中。

所有这些存储库类都可以通过创建一个类DbConnectionHelper的实例然后读取其ConnString属性来获取连接字符串吗?

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

2 个答案:

答案 0 :(得分:3)

同一个类的单独实例是独立的并且不共享公共数据,除非它们都对公共对象具有依赖性(例如类中的静态变量或对所有或者相同的另一个对象的引用)至少在某些情况下。)

在您的情况下,这根本不是问题 - 您每次需要时都会创建一个DBConnectionHelper类的隔离实例,并将其用于构建连接字符串。如果多个线程尝试并访问共享对象的方法,则只需担心线程安全。

答案 1 :(得分:2)

是的,您可以在单独的线程中创建类的单独实例,而不会出现任何问题。如果您从不同的线程访问静态类/成员,或者在线程之间共享类的 SAME 实例,事情会变得更复杂,但您正在做的事情是完全安全的。

另外,您可能希望避免从UI线程加载实体框架实体,因为在从数据库加载实体时,UI将无响应。那是使用后台工作线程或Task的好时机。