#c# #.net #wcf #f#
#c# #.net #wcf #f#
Вопрос:
Каков наилучший способ реализовать операцию, подобную Gather-Scatter, с использованием WCF и C # (или F #)?
- Допустим, у меня есть 20 узлов (компьютеров), соединенных с помощью WCF.
- Каждый узел вычисляет
time duration
значение и отправляет это значение вmain node
. 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. Реализуйте обратный вызов на клиентских узлах, который сервер запустит после вычисления минимального значения.
Комментарии:
1. Спасибо. Эта подсказка очень помогла. Теперь это работает как шарм (см. Мой первый пост).