2using System.Collections.Generic;
4using System.Threading.Tasks;
12 internal class CommandStatus<ResponseType> : CommandStatusBase
14 public Dictionary<IPEndPoint, KeyValuePair<ResponseType, Exception>> Responses =
new Dictionary<IPEndPoint, KeyValuePair<ResponseType, Exception>>();
15 public EventHandlerAsync<ClusterResponseEventArgs<ResponseType>> Callback;
22 public override bool IsComplete(EndpointStatus[] Statuses)
26 foreach (EndpointStatus Status
in Statuses)
28 if (!this.Responses.ContainsKey(Status.Endpoint))
40 public EndpointResponse<ResponseType>[] GetResponses(EndpointStatus[] Statuses)
42 EndpointResponse<ResponseType>[] Result;
47 foreach (EndpointStatus Status
in Statuses)
49 if (!this.Responses.ContainsKey(Status.Endpoint))
50 this.Responses[Status.Endpoint] =
new KeyValuePair<ResponseType, Exception>(
default,
new TimeoutException(
"No response returned."));
53 Result =
new EndpointResponse<ResponseType>[c = this.Responses.Count];
56 foreach (KeyValuePair<IPEndPoint, KeyValuePair<ResponseType, Exception>> P
in this.Responses)
57 Result[i++] =
new EndpointResponse<ResponseType>(P.Key, P.Value.Key, P.Value.Value);
68 public override void AddResponse(IPEndPoint From,
object Response)
72 if (Response is ResponseType Response2)
73 this.Responses[From] =
new KeyValuePair<ResponseType, Exception>(Response2,
null);
75 this.Responses[From] =
new KeyValuePair<ResponseType, Exception>(
default,
new Exception(
"Unexpected response returned."));
84 public override void AddError(IPEndPoint From, Exception Error)
88 this.Responses[From] =
new KeyValuePair<ResponseType, Exception>(
default, Error);
96 public override Task RaiseResponseEvent(EndpointStatus[] CurrentStatus)
98 return this.Callback.Raise(
this,
new ClusterResponseEventArgs<ResponseType>(
99 this.Command, this.GetResponses(CurrentStatus), this.State));