类似于使用WCF和c# (f#)的收集分散操作

本文关键字:操作 分散 WCF 类似于 | 更新日期: 2023-09-27 18:11:17

使用WCF和c#(或f#)实现收集-分散操作的最佳方法是什么?

  1. 假设我有20个节点(计算机)通过WCF连接。
  2. 每个节点计算一个time duration的值,并将此值发送给main node
  3. main node取所有传入的最小值,并将此信息发送回所有节点。
编辑:

结果代码:

open System.ServiceModel
open System.ServiceModel.Channels
let numberOfClients = 10
type IMyContractCallback =
  [<OperationContract>]
  abstract GetDuration: duration: float -> unit
[<ServiceContract(CallbackContract = typeof<IMyContractCallback>)>]
type IMyContract =
    [<OperationContract>]
    abstract SendDuration: duration: float -> unit
[<ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant)>]
type MyService () =
  let mutable totDuration = 1.
  let callbacks = System.Collections.Generic.Stack ()
  interface IMyContract with
    member o.SendDuration (duration) =
        totDuration <- min totDuration duration
        callbacks.Push (OperationContext.Current.GetCallbackChannel<IMyContractCallback>())
        printfn "N = %d" callbacks.Count
        if callbacks.Count = numberOfClients then
          for c in callbacks do c.GetDuration (totDuration)
  interface IMyContractCallback with
    member o.GetDuration (duration) = printfn "Minimum duration = %g" duration
let address = "net.pipe://localhost/aaa"
let service = MyService ()
let pipe = new NetNamedPipeBinding()
let host = new ServiceHost(service)
host.AddServiceEndpoint(typeof<IMyContract>, pipe, address) |> ignore
host.Open()
for i in 0 .. numberOfClients - 1 do
  let client1 = System.Threading.Thread (fun () ->
    let fact = new DuplexChannelFactory<IMyContract>(new InstanceContext(service), pipe, address)
    let ch = fact.CreateChannel()
    ch.SendDuration (0.4 + float i) )
  client1.Start()

类似于使用WCF和c# (f#)的收集分散操作

使用WCF很容易做到这一点。在客户端节点上实现一个回调,服务器将在计算最小值后触发该回调。

参见WCF Callbacks;初学者指南