给定:禁止从一个线程构造ADO Connection对象并将其提供给另一个线程.两个线程是不同的公寓,即使第一个线程永远不会再触摸它(甚至没有保持对它的引用!),这没关系.
该ADO Connection对象是由ThreadA创建的,ThreadA是唯一一个在任何情况下都可以使用该Connection对象的线程.
现在将"ADO Connection"替换为"ADO.NET Connection".是否适用同样的规则?
我知道.NET框架中的大多数对象都不是线程安全的.例如,SDK中的DictionaryEntry结构说:
线程安全此类型的
任何公共静态成员都是线程安全的.任何实例成员都不保证是线程安全的.
据我所知,不是线程安全意味着如果我要从不同的线程访问它,我必须同步对象的访问.这一切都很好,我可以确保一次只有一个线程访问该对象:
lock (myObject) { ... }
但是有一些东西不仅仅是线程安全的.
在COM中,(某些)对象被绑定到创建它的" 公寓 ".一旦在一个公寓上构建了对象,就禁止您从另一个公寓访问它 - 无论您从多个同时进行的线程访问中保护该对象多少.
.NET中是否存在类似的概念?
我知道你被禁止从创建它的线程以外的线程访问控件 - 即使你以线程安全的方式使用它.这在MSDN上没有记录:
线程安全
只有以下成员是线程安全的:如果已经创建了控件的句柄,则为BeginInvoke,EndInvoke,Invoke,InvokeRequired和CreateGraphics.在后台线程上创建控件的句柄之前调用CreateGraphics会导致非法的跨线程调用.
当您从单个线程创建和使用异常时,没有提到控件抛出异常 - 当该线程不是应用程序启动时创建的第一个线程时.
但是任意物体呢?关于什么:
public class MyClass { int _number; public int Number { get { return _number; } set { _number = value; } } } MyClass myObject = new MyClass();
只要我同步访问myObject,两个线程就可以与它通信了吗?
同样适用于:
List
两个线程可以与列表通信,只要它们不同时执行,通常使用:
lock (sharedList) { sharedList.Add(data); }
允许两个线程接触同一个对象?
同样适用于:
IAsyncResult ar = BeginSetLabelToTheValueINeed(label1); ... EndSetLabelToTheValueINeed(ar);
同样适用于:
//Fetch image on connection that is an existing DB transaction public static Bitmap GetImageThumbnail(DbConnection conn, int imageID) { }
被转换为异步委托模式:
//Begin fetching an image on connection that is an existing DB transaction IAsyncResult ar = BeginGetImageThumbnuts(conn, imageID, callback, stateOjbect); ... //Finish fetching an image on connection that is an existing DB transaction Bitmap thumb = EndGetImageNumbthail(ar);
人们开始讨论ADO.NET中的设计模式,而不是回答这个问题.请回答这个问题.如果他们混淆和分散你的松鼠脑子,请忽略这些例子.