开发者

Gather scatter like operation using WCF and C# (F#)

开发者 https://www.devze.com 2023-04-13 03:11 出处:网络
What is the best way to implement Gather-Scatter like operation using WCF and C# (or F#)? Lets say that I have 20 nodes (computers) connected by WCF.

What is the best way to implement Gather-Scatter like operation using WCF and C# (or F#)?

  1. Lets say that I have 20 nodes (computers) connected by WCF.
  2. Each node computes a time duration value and sends this value to the main node.
  3. The main node takes the minimum value of all the incomming ones and sends this information back to all the nodes.

EDIT:

The resulting code:

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(servic开发者_如何学Pythone)
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()


You can easily do this with WCF. Implement a callback on the client nodes that the server will fire after computing the minimum value.

See WCF Callbacks; a beginners guide

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号