private void TaskComplete(object o, TaskCompleteEventArgs e) { task.Completed -= TaskComplete; SendQueryEventArgs args = (SendQueryEventArgs)e; if (args.TimedOut) { bucket.SortBySeen(); int index = bucket.Nodes.IndexOf(node); if (index == -1 || (++index < bucket.Nodes.Count)) { QueryNode(bucket.Nodes[0]); } else { RaiseComplete(new TaskCompleteEventArgs(this)); } } else { RaiseComplete(new TaskCompleteEventArgs(this)); } }
internal async Task <SendQueryEventArgs> SendQueryAsync(QueryMessage query, Node node) { SendQueryEventArgs e = default(SendQueryEventArgs); for (int i = 0; i < 4; i++) { e = await MessageLoop.SendAsync(query, node); // If the message timed out and we we haven't already hit the maximum retries // send again. Otherwise we propagate the eventargs through the Complete event. if (e.TimedOut) { node.FailedCount++; continue; } else { node.Seen(); return(e); } } return(e); }