public IEnumerable <Task <SensorDto> > OpenStream(IEnumerable <string> ids) { while (true) { foreach (var id in ids) { yield return(SensorData.GetSensorAsync(id)); } } }
public async Task Tasks_FromAsync_Linq() { var ids = new string[] { "iddqd", "idkfq", "abba5", "acdc1" }; var tasksLinq = ids.Select(e => SensorData.GetSensorAsync(e)).ToList(); var results = await Task.WhenAll(tasksLinq); // Select is lazy, but now tasksLinq is a List // Try what happes without .ToList() and with it var over10Sensors = tasksLinq.Where(e => e.Result.Data > 10).ToList(); }
public async Task Lazy_Class() { var sensor = new Lazy <Task <SensorDto> >(async() => { Trace.WriteLine("Fetching data"); return(await SensorData.GetSensorAsync("abba5")); }); Assert.False(sensor.IsValueCreated); var data = await sensor.Value; var dataOther = await sensor.Value; }
public void ReferenceType() { var sensorRequest = new SensorRequest { Id = "iddqd" }; var getData = new Func <SensorRequest, Task <SensorDto> >(async request => { await Task.Delay(1000); return(await SensorData.GetSensorAsync(request.Id)); }); var sensorTask = getData(sensorRequest); sensorRequest.Id = "idkfa"; var result = sensorTask.Result; }
public async Task Linq_Select_Lazy() { // 07_Linq has and example of LINQ Select. This example shows more complicated case with API requests // Find first sensor with data value under 23 var sensorIds = new[] { "iddqd", "idkfa", "abba5", "acdc1" }; // Have to use own extension method as Where/First etc. do not support async var item = await sensorIds.Select(async id => { var data = await SensorData.GetSensorAsync(id); Trace.WriteLine(JsonConvert.SerializeObject(data)); return(data); }) .FirstOrDefaultAsync(async s => (await s).Data < 23); Trace.WriteLine($"First item: {JsonConvert.SerializeObject(item)}"); }
public void SensorId() { var selectedSensor = "iddqd"; var getData = new Func <Task <SensorDto> >(async() => { await Task.Delay(1000); return(await SensorData.GetSensorAsync(selectedSensor)); }); var sensorTask = getData(); selectedSensor = "idkfa"; var result = sensorTask.Result; // Fix // var getData = new Func<string Task<SensorDto>>(async sensorId => }
public async Task Tasks_FromAsync() { var ids = new string[] { "iddqd", "idkfq", "abba5", "acdc1" }; var tasks = new List <Task <double> >(); foreach (var id in ids) { var dataTask = SensorData.GetDataAsync(id); tasks.Add(dataTask); } var results = await Task.WhenAll(tasks); var tasksLinq = ids.Select(e => SensorData.GetSensorAsync(e)).ToList(); var results2 = await Task.WhenAll(tasksLinq); // Select is lazy, but now tasksLinq is a List var high = tasksLinq.Where(e => e.Result.Data > 10).ToList(); }