C#里面如何保持多个用户使用同一对象实例?

comradeinit 2006-05-23 09:12:36
目前的解决方案是做成COM+,一个方法是使用静态字段,另一方法是使用对象池。请教高手们有没有更好的方法,前面的两个方法哪个更好?谢谢。
...全文
479 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
comradeinit 2006-05-24
  • 打赏
  • 举报
回复
to Ivony(要在一个机器上只能有一个实例?):我的目的是在内存建立对象库,由多进程访问,其中访问客户包括WebService服务和普通桌面程序,它们共同访问同一对象库,在C++里我是用共享内存实现的,但C#管制程序不支持。
真相重于对错 2006-05-24
  • 打赏
  • 举报
回复
lz的com+ Pool 方式应该可以,记住组件类要加上
[Synchronization]
禁止一个以上客户端同时调用
comradeinit 2006-05-24
  • 打赏
  • 举报
回复
谢谢hdt(倦怠)的详细介绍。我试过单件模式也可以,但一般不能把服务器对象作单件模式处理,否则客户端不好用new建立代理对象。可另建一个普通对象不要从servicecomponent继承,使用单件模式,在服务器对象中引用普通单件对象即可,不过毕竟是使用同一对象实例,不管那种方法都必须考虑线程安全。另请教一下hdt(倦怠),有其他不用new的方法建立客户端代理对象吗?
真相重于对错 2006-05-24
  • 打赏
  • 举报
回复
个人感觉单件模式只是逻辑上能达到lz的要求,因为要在一个进程下可以,多进程,能保证么?
真相重于对错 2006-05-24
  • 打赏
  • 举报
回复
服务器激活请参见
激活 | 客户端激活 | WellKnownObjectMode 枚举 | 激活 | 生存期租约
语言
C#

Visual Basic

全部显示
服务器激活的对象是其生存期由服务器直接控制的对象。服务器应用程序域只有在客户端在对象上进行方法调用时才创建这些对象,而不会在客户端调用 new(在 Visual Basic 中为 New())或 Activator.GetObject 时创建这些对象;这节省了仅为创建实例而进行的一次网络往返过程。客户端请求服务器激活的类型实例时,只在客户端应用程序域中创建一个代理。然而,这也意味着当您使用默认实现时,只允许对服务器激活的类型使用默认构造函数。若要发布其实例将使用带参数的特定构造函数创建的类型,可以使用客户端激活或者动态地发布您的特定实例。

服务器激活的对象有两种激活模式(或 WellKnownObjectMode 值):Singleton 和 SingleCall。

Singleton 类型任何时候都不会同时具有多个实例。如果存在实例,所有客户端请求都由该实例提供服务。如果不存在实例,服务器将创建一个实例,而所有后继的客户端请求都将由该实例来提供服务。由于 Singleton 类型具有关联的默认生存期,即使任何时候都不会有一个以上的可用实例,客户端也不会总接收到对可远程处理的类的同一实例的引用。

SingleCall 类型对于每个客户端请求始终只有一个实例。下一个方法调用将由另一个服务器实例提供服务,即使上一个实例尚未被系统回收。SingleCall 类型不参与生存期租约系统。

为了创建服务器激活的类型的实例,客户端要么以编程方式(或使用配置文件)配置它们的应用程序并调用 new,要么在对 Activator.GetObject 的调用中传递远程对象的配置。

注意 可能不需要在客户端上注册信道。如果客户端未注册信道,远程处理系统将使用在 Machine.config 文件中指定的默认信道之一自动选择或创建一个信道以发出传出的请求。客户端上的这一自动信道选择并不注册信道来侦听服务器中的任何回调函数,并且不注册任何自定义信道实现(除非该自定义信道已添加到 machine.config 文件中)。这些情况下,必须在客户端应用程序域中注册要使用的信道类型。
下面的代码示例显示一个对 Activator.GetObject 的调用(假定已经注册一个 TcpChannel 以在端口 8080 上通信)。如果客户端只知道服务器对象实现了某个特定的接口,则必须使用对 Activator.GetObject 的调用,这是因为您只能使用 new(在 Visual Basic 中为 New)创建类的实例。

Ivony 2006-05-24
  • 打赏
  • 举报
回复
要在一个机器上只能有一个实例?
Ivony 2006-05-24
  • 打赏
  • 举报
回复
C#肯定不支持的,因为垃圾回收的缘故,托管对象在内存中的位置是不固定的。到现在才弄明白楼主要做一个什么东西。
tl0 2006-05-23
  • 打赏
  • 举报
回复
同意楼上单件模式
marvelstack 2006-05-23
  • 打赏
  • 举报
回复
在服务器端使用单件模式,但是要使用线程安全,
http://zhzuo.cnblogs.com/archive/2004/07/18/25324.html
comradeinit 2006-05-23
  • 打赏
  • 举报
回复
wuyazhe和songhtao的方法同我原来使用静态字段的方法类似,结帖给分。不知还有其他方法没有???
Ivony 2006-05-23
  • 打赏
  • 举报
回复
请问对象池怎么让几个用户使用“同一个”实例?
我不懂电脑 2006-05-23
  • 打赏
  • 举报
回复
单件模式用在服务端可以保证服务端只有一个实例。
兔子-顾问 2006-05-23
  • 打赏
  • 举报
回复
使用设计模式里的“单例模式”。
Ivony 2006-05-23
  • 打赏
  • 举报
回复
其实说白了就是LazyLoad了

if( instanse == null )
instanse = CreateInstanse();
return instanse;
Ivony 2006-05-23
  • 打赏
  • 举报
回复
to Ivony:对象数最大最小都为1,但要考虑线程安全
那还叫池吗?
comradeinit 2006-05-23
  • 打赏
  • 举报
回复
to Ivony:对象数最大最小都为1,但要考虑线程安全

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧