c# – 处理与整个应用程序的对象交互的并发性和复杂的WCF服务

我很高兴创建和托管WCF服务.

到目前为止,我可以创建定义服务和数据(接口)合同的服务,并定义主机和配置选项以达到它们(端点规范).

好吧,考虑这段代码定义一个服务并使用它(没有提到app.config中定义的端点,这里没有显示):

[ServiceContract]
public interface IMyService {
   [OperationContract]
   string Operation1(int param1);
   [OperationContract]
   string Operation2(int param2);
}

public class MyService : IMyService {
   public string Operation1(int param1) { ... }
   public string Operation2(int param2) { ... }
}

public class Program {
   public static void Main(stirng[] args) {
      using (ServiceHost host = new ServiceHost(typeof(MyService))) {
         host.Open();
         ...
         host.Close();
      }
   }
}

嗯,这种结构在创建可称为独立服务的东西时很好.
如果我需要我的服务来使用更大应用程序的对象,该怎么办?
例如,我需要一个基于我的程序中某个地方(托管服务)定义的某个集合的服务.该服务必须查看此集合并搜索并返回特定元素.

我所说的列表是由程序管理并由它编辑和修改的列表.

我有以下问题:

1)如何构建能够处理此列表的服务?
我知道可能的选择是使用重载的ServiceHost构造函数接受Object而不是Type服务.
所以我可以在那里通过我的清单.好吗?

[ServiceContract]
public interface IMyService {
   [OperationContract]
   string Operation1(int param1);
   [OperationContract]
   string Operation2(int param2);
}

public class MyService : IMyService {
   private List<> myinternallist;
   public MyService(List<> mylist) {
      // Constructing the service passing the list
   }
   public string Operation1(int param1) { ... }
   public string Operation2(int param2) { ... }
}

public class Program {
   public static void Main(stirng[] args) {
      List<> thelist;
      ...
      MyService S = new MyService(thelist)
      using (ServiceHost host = new ServiceHost(S)) {
         host.Open();
         ...
         host.Close();
         // Here my application creates a functions and other that manages the queue. For this reason my application will edit the list (it can be a thread or callbacks from the user interface)
      }
   }
}

这个例子应该澄清.
这是好的方式吗?我做对了吗?

2)如何在我的服务和我的应用程序之间处理此共享资源上的冲突?
当我的应用程序运行,托管服务时,我的应用程序可以在列表中插入项目并删除它们,同样可以执行服务.我需要互斥锁吗?怎么处理这个?
请注意,并发问题涉及两个参与者:主应用程序和服务.确实,该服务是单身,但应用程序在列表中行动!
我假设服务是由外部实体调用的,当发生这种情况时,应用程序仍然可以运行吗?在这种情况下是否有并发???

谢谢

最佳答案 关于第2点,您可以使用
Concurrent Collections来管理所需的大部分线程安全性.

我不确定你在第1点的意思.听起来你在描述基本的polymorphism,但也许你可以用一个例子来澄清吗?

编辑:回应你对Sixto的答案所做的评论,考虑使用WCF的sessions.从你所描述的内容来看,听起来像WCF服务应该坐在一个单独的主机应用程序上.您当前使用的应用程序应具有对服务的服务引用,并且使用会话将能够调用模拟您使用当前客户端应用程序定义的列表实例化服务的要求的操作.

将此与我对暴露允许与此列表进行交互的操作的评论相结合,您将能够运行多个客户端计算机,处理会话存储列表?

希望这个解释得很好.

点赞