public async Task ClientMultipleComputationsAndIterators() { var NUM_COMPUTATIONS = 1000; var grain = GrainFactory.GetGrain <IMyOtherReactiveGrain>(random.Next()); var Rcs = new List <IReactiveComputation <string[]> >(); for (var i = 0; i < NUM_COMPUTATIONS; i++) { Rcs.Add(GrainFactory.StartReactiveComputation(async() => { var res1 = await grain.GetValue(1); var res2 = await grain.GetValue(1); var res3 = await grain.GetValue(2); return(new[] { res1, res2, res3 }); })); } var Its1 = Rcs.Select((rc) => rc.GetResultEnumerator()).ToList(); var Its2 = Rcs.Select((rc) => rc.GetResultEnumerator()).ToList(); var NextResults1 = await Task.WhenAll(Its1.Select((it) => it.NextResultAsync()).ToList()); var NextResults2 = await Task.WhenAll(Its2.Select((it) => it.NextResultAsync()).ToList()); foreach (var NextResult1 in NextResults1) { Assert.Equal(NextResult1, new[] { "foo", "foo", "foo" }); } foreach (var NextResult2 in NextResults2) { Assert.Equal(NextResult2, new[] { "foo", "foo", "foo" }); } await grain.SetValue("bar"); // wait for all updates to propagate await Task.Delay(3000); NextResults1 = await Task.WhenAll(Its1.Select((it) => it.NextResultAsync()).ToList()); NextResults2 = await Task.WhenAll(Its2.Select((it) => it.NextResultAsync()).ToList()); foreach (var NextResult1 in NextResults1) { Assert.Equal(NextResult1, new string[] { "bar", "bar", "bar" }); } foreach (var NextResult2 in NextResults2) { Assert.Equal(NextResult2, new[] { "bar", "bar", "bar" }); } foreach (var Rc in Rcs) { Rc.Dispose(); } }
/// <inheritdoc cref="IDisposable.Dispose" /> public void Dispose() { if (!_disposed) { _disposed = true; Vehicle.Dispose(); Rc.Dispose(); Map.Dispose(); Camera.Dispose(); _camera.Dispose(); _rc.Dispose(); _multirotorVehicle.Dispose(); Proxy.Dispose(); } }
public async Task MultipleComputationsUsingSameMethodSameActivation(int randomoffset) { int NumComputations = 100; var grain = GrainFactory.GetGrain <IMyOtherReactiveGrain>(randomoffset); List <IReactiveComputation <string> > ReactComps = new List <IReactiveComputation <string> >(); for (var i = 0; i < NumComputations; i++) { ReactComps.Add(GrainFactory.StartReactiveComputation(() => grain.GetValue() )); } var Its = ReactComps.Select((Rc) => Rc.GetResultEnumerator()).ToList(); // await all first results var Results1 = await Task.WhenAll(Its.Select(It => It.NextResultAsync() ).ToList()); foreach (var result1 in Results1) { Assert.Equal(result1, "foo"); } // update the dependency await grain.SetValue("bar"); // await all second results var Results2 = await Task.WhenAll(Its.Select(It => It.NextResultAsync())); foreach (var result2 in Results2) { Assert.Equal(result2, "bar"); } foreach (var Rc in ReactComps) { Rc.Dispose(); } }
public async Task MultipleComputationsUsingSameMethodDifferentActivation(int randomoffset) { int NumComputations = 1000; List <IReactiveComputation <string> > ReactComps = new List <IReactiveComputation <string> >(); for (var i = 0; i < NumComputations; i++) { var grain = GrainFactory.GetGrain <IMyOtherReactiveGrain>(randomoffset + i); ReactComps.Add(GrainFactory.StartReactiveComputation(() => grain.GetValue())); } var Its = ReactComps.Select((Rc) => Rc.GetResultEnumerator()).ToList(); var Results1 = await Task.WhenAll(Its.Select(It => It.NextResultAsync())); foreach (var result1 in Results1) { Assert.Equal(result1, "foo"); } for (var j = 0; j < NumComputations; j++) { await GrainFactory.GetGrain <IMyOtherReactiveGrain>(randomoffset + j).SetValue("bar" + j); } var Results2 = await Task.WhenAll(Its.Select(It => It.NextResultAsync())); var k = 0; foreach (var result2 in Results2) { Assert.Equal(result2, "bar" + k++); } foreach (var Rc in ReactComps) { Rc.Dispose(); } }