我正在开发一个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()。
答案 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