当前位置:  开发笔记 > 程序员 > 正文

.NET Framework:对象公寓是否绑定?

如何解决《.NETFramework:对象公寓是否绑定?》经验,为你挑选了0个好方法。

给定:禁止从一个线程构造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 sharedList = new 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中的设计模式,而不是回答这个问题.请回答这个问题.如果他们混淆和分散你的松鼠脑子,请忽略这些例子.

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有