Собрать разбросанные операции с использованием WCF и C # (F #)

#c# #.net #wcf #f#

#c# #.net #wcf #f#

Вопрос:

Каков наилучший способ реализовать операцию, подобную Gather-Scatter, с использованием 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()
  

Ответ №1:

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

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

Комментарии:

1. Спасибо. Эта подсказка очень помогла. Теперь это работает как шарм (см. Мой первый пост).