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);
        }