void KBR_Callback(IAsyncResult ar) { RoutingResult rr = _dht.KeyBasedRouter.EndRoute (ar); if (rr.RootCandidates == null || rr.RootCandidates.Length == 0) { //TimeSpan time = DateTime.Now.Subtract (_start); _result = new GetResult (_key, null, rr.Hops); Done (); return; } _hops = rr.Hops; int count; object msg; AsyncCallback callback; if (_getMethod) { count = Math.Min (_dht.NumberOfReplicas, rr.RootCandidates.Length); msg = new GetRequest (_key, _typeId); callback = GetRequest_Callback; } else { count = Math.Min (_dht.NumberOfReplicas, rr.RootCandidates.Length); msg = _putReq; callback = PutRequest_Callback; } _getInquires = count; for (int i = 0; i < count; i ++) { if (rr.RootCandidates[i].EndPoint == null) { if (_getMethod) { lock (_getLock) { _getInquires --; object[] ret = _dht.LocalHashTable.Get (_key, _typeId, _dht._mergerMap[_typeId]); if (ret != null || _getInquires == 0) { _result = new GetResult (_key, ret, rr.Hops); Done (); return; } else { } } } else { _dht.LocalPut (_putReq.Key, _putReq.LifeTime, _putReq.Value, null); Done (); } } else { _dht.MessagingSocket.BeginInquire (msg, rr.RootCandidates[i].EndPoint, callback, rr.RootCandidates[i].EndPoint); } } }
void PutRequest_Callback(IAsyncResult ar) { _dht.MessagingSocket.EndInquire (ar); _result = null; Done (); }
void GetRequest_Callback(IAsyncResult ar) { EndPoint remoteEP = (EndPoint)ar.AsyncState; GetResponse res = _dht.MessagingSocket.EndInquire (ar) as GetResponse; lock (_getLock) { if (_result != null) return; _getInquires --; if (res == null || res.Values == null) { if (_getInquires != 0) return; _result = new GetResult (_key, null, _hops); } else { for (int i = 0; i < res.Values.Length; i ++) { IPutterEndPointStore epStore = res.Values[i] as IPutterEndPointStore; if (epStore != null && epStore.EndPoint == null) epStore.EndPoint = remoteEP; } _result = new GetResult (_key, res.Values, _hops); } } Done (); }