async Task RunAsync() { var httpClient = new HttpClient(); var digitalTwinsClient = new DigitalTwinsClient(_digitalTwinsInstanceUrl, _credential, new DigitalTwinsClientOptions { Transport = new HttpClientTransport(httpClient) }); _log.LogInformation("Reading model file {modelsFile}", _digitalTwinsModelsFile); var modelList = new[] { _digitalTwinsModelsFile }.Select(File.ReadAllText).ToList(); var parser = new ModelParser(); var parsed = await parser.ParseAsync(modelList); _log.LogInformation("Parsed {entityCount} entities", parsed.Keys.Count()); var models = modelList .SelectMany(JsonConvert.DeserializeObject <List <JObject> >) .ToList(); var(successCount, conflictCount) = (0, 0); foreach (var model in models) { var modelString = JsonConvert.SerializeObject(model); try { await digitalTwinsClient.CreateModelsAsync(new[] { modelString }); successCount++; } catch (RequestFailedException e) when(e.Status == 409) // Conflict { // ignore conflictCount++; } } _log.LogInformation("Uploaded {successCount} entities, skipped {conflictCount} entities", successCount, conflictCount); var f = models.FirstOrDefault()?.GetValue("@id"); if (f is null) { _log.LogInformation("Not creating twins"); return; } DigitalTwinMetadata twinMetadata = new DigitalTwinMetadata { ModelId = f.ToString() }; _log.LogInformation("Creating {numTwins} device twins of type {twinType}", NumTwins, twinMetadata.ModelId); var num = 0; Parallel.For(0, NumTwins, new ParallelOptions { MaxDegreeOfParallelism = 50 }, i => { var deviceId = $"contoso-device-id-{i.ToString("000000")}"; digitalTwinsClient.CreateOrReplaceDigitalTwin(deviceId, new BasicDigitalTwin { Metadata = twinMetadata }); _log.LogDebug("Created twin {deviceId}", deviceId); var n = Interlocked.Increment(ref num); if (n % 100 == 0) { _log.LogInformation("Created twin {n} of {numTwins}", n, NumTwins); } }); _log.LogInformation("Created {numTwins} twins", NumTwins); }