private IAsyncResult RemoteAsyncCallView(TupleSpace space) { AsyncViewDelegate RemoteDel = new AsyncViewDelegate(space.RequestView); IAsyncResult RemAr = RemoteDel.BeginInvoke(null, null); return(RemAr); }
private Dictionary <string, TupleSpace> GetViews() { List <string> leaderView = null; leaderView = GetLeaderView(); Dictionary <string, TupleSpace> result = new Dictionary <string, TupleSpace>(); if (leaderView != null) { foreach (string server in leaderView) { result[server] = (TupleSpace)TupleSpaces[server]; } //Console.WriteLine(String.Join(",", leaderView)); return(result); } while (leaderView == null) { Dictionary <string, KeyValuePair <IAsyncResult, WaitHandle> > results = new Dictionary <string, KeyValuePair <IAsyncResult, WaitHandle> >(); List <WaitHandle> waits = new List <WaitHandle>(); foreach (KeyValuePair <string, Pingable> entry in TupleSpaces) { //IAsyncResult ar = RemoteAsyncCallTakeSelect(space, schema, id, seq); IAsyncResult ar = RemoteAsyncCallView((TupleSpace)entry.Value); results.Add(entry.Key, new KeyValuePair <IAsyncResult, WaitHandle>(ar, ar.AsyncWaitHandle)); waits.Add(ar.AsyncWaitHandle); } WaitHandle.WaitAll(waits.ToArray(), 500); List <List <string> > views = new List <List <string> >(); foreach (var entry in results) { if (entry.Value.Value.WaitOne(0)) { AsyncViewDelegate del = (AsyncViewDelegate)((AsyncResult)entry.Value.Key).AsyncDelegate; try { leaderView = del.EndInvoke(entry.Value.Key); } catch (Exception e) {} if (leaderView != null) { currentLeader = entry.Key; break; } } } } foreach (string server in new HashSet <string>(leaderView)) { result[server] = (TupleSpace)TupleSpaces[server]; } //Console.WriteLine(String.Join(",", leaderView)); return(result); }
private List <string> GetLeaderView() { List <string> result = null; if (currentLeader == null) { return(null); } IAsyncResult ar = RemoteAsyncCallView((TupleSpace)TupleSpaces[currentLeader]); WaitHandle wait = ar.AsyncWaitHandle; if (wait.WaitOne(500)) { AsyncViewDelegate del = (AsyncViewDelegate)((AsyncResult)ar).AsyncDelegate; try { result = del.EndInvoke(ar); } catch (Exception e) { /* Console.WriteLine(e);*/ } } return(result); }