如何确定Azure IoT中心设备双胞胎上的更新何时完成?

时间:2020-08-03 17:06:25

标签: azure azure-iot-hub asp.net-core-3.0 .net-core-3.0

我正在开发一个Web应用程序,该应用程序将更改Azure IoT中心中的设备孪生。因此,Web应用程序的用户可以通过我的网络对设备孪生进行更改,然后他可以根据需要再次查询设备属性-但是如果他足够快,则还不会对设备孪生进行更改。 / p>

我正在使用Microsoft.Azure.Devices.RegistryManager.UpdateTwinAsync()更改设备双胞胎。问题在于,这是一个异步方法,没有回调参数让我知道更新何时完成。因此,我不知道何时对设备Twin进行更改-如果更新后查询得太快,可能会得到较旧的版本。如何检测何时100%完成更新?

...当然,每个使用UpdateTwinAsync()的人都遇到了这个问题,对吗?

已编辑:

好吧,我已经对此进行了一些测试,我很确定在致电给

await registryManager.UpdateTwinAsync(deviceId, patch, etag);

完成,即程序在此行之后移至下一行,表明孪生设备尚未更新。而是在IoT中心中启动了一些更新序列。因此,在此之后的下一行不能确保更新了设备孪生。

对我来说,这听起来像是一个糟糕的设计。为什么将UpdateTwinAsync()设为可以“等待”的异步方法?

也许有一种解决方法,可以立即在我的UpdateDevice()方法中获取设备twin,并检查是否已增加twin“版本”,然后才从我的方法中返回状态代码。仅供参考,我的方法称为UpdateDevice(),浏览器在Web服务器后端上调用它,而Web服务器后端又在IoT中心上调用UpdateTwinAsync()。

1 个答案:

答案 0 :(得分:0)

您是否尝试过使用await运算符? 这是代码。

var twin = await registryManager.GetTwinAsync("myDeviceId");
var patch =
    @"{
        tags: {
            location: {
                region: 'US',
                plant: 'Redmond43'
            }
        }
    }";
await registryManager.UpdateTwinAsync(twin.DeviceId, patch, twin.ETag);

var query = registryManager.CreateQuery(
  "SELECT * FROM devices WHERE tags.location.plant = 'Redmond43'", 100);
var twinsInRedmond43 = await query.GetNextAsTwinAsync();
Console.WriteLine("Devices in Redmond43: {0}", 
  string.Join(", ", twinsInRedmond43.Select(t => t.DeviceId)));

有关更多信息,https://docs.microsoft.com/en-us/azure/iot-hub/iot-hub-csharp-csharp-twin-getstarted