Соберите разброс, как операция с использованием WCF и C # (F #) - PullRequest
2 голосов
/ 14 октября 2011

Каков наилучший способ реализации операции типа Gather-Scatter с использованием WCF и C # (или F #)?

  1. Допустим, у меня есть 20 узлов (компьютеров), подключенных WCF.
  2. Каждый узел вычисляет значение time duration и отправляет это значение в main node.
  3. main node принимает минимальное значение из всех входящих и отправляет эту информацию всем узлам.

EDIT:

Полученный код:

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()

1 Ответ

3 голосов
/ 14 октября 2011

Вы можете легко сделать это с WCF. Реализуйте обратный вызов на клиентских узлах, которые сервер будет запускать после вычисления минимального значения.

См. Обратные вызовы WCF; руководство для начинающих

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...