我想让我更清楚地了解在多线程应用程序中使用类的实例:
我可以在不同的线程中使用同一个类的实例吗?换句话说,我可以在不同的线程中创建同一个类的实例吗?
例如:
我有一个类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;
答案 0 :(得分:3)
同一个类的单独实例是独立的并且不共享公共数据,除非它们都对公共对象具有依赖性(例如类中的静态变量或对所有或者相同的另一个对象的引用)至少在某些情况下。)
在您的情况下,这根本不是问题 - 您每次需要时都会创建一个DBConnectionHelper
类的隔离实例,并将其用于构建连接字符串。如果多个线程尝试并访问共享对象的方法,则只需担心线程安全。
答案 1 :(得分:2)
是的,您可以在单独的线程中创建类的单独实例,而不会出现任何问题。如果您从不同的线程访问静态类/成员,或者在线程之间共享类的 SAME 实例,事情会变得更复杂,但您正在做的事情是完全安全的。
另外,您可能希望避免从UI线程加载实体框架实体,因为在从数据库加载实体时,UI将无响应。那是使用后台工作线程或Task
的好时机。