OpenAsync成功后,为什么DeviceClient SetDesiredPropertyUpdateCallbackAsync会立即超时?

时间:2018-01-19 19:07:50

标签: azure-iot-hub azure-iot-edge

作为IoTHub DeviceClient初始化的一部分,我明确打开与OpenAsync的连接,然后立即调用SetDesiredPropertyUpdateCallbackAsync。有时当我调用SetDesiredPropertyUpdateCallbackAsync时,它会超时并出现异常。如果我的网络连接稳定,为什么我不在OpenAsync而不是SetDesiredPropertyUpdateCallbackAsync上获得超时?我相信它甚至在内部进行相同的OpenAsync调用以确保连接是开放的。

ioTHubModuleClient = DeviceClient.CreateFromConnectionString(ConnectionString, settings);
await ioTHubModuleClient.OpenAsync().ConfigureAwait(false);
await ioTHubModuleClient.SetDesiredPropertyUpdateCallbackAsync(OnModulePropertyUpdateRequested, this).ConfigureAwait(false);

更新 我发现如果我在此之前注册了SetConnectionStatusChangesHandler,我可以看到它无休止地连接/断开,直到我调用SetDesiredPropertyUpdateCallbackAsync时超时。

  

IoTHub连接现在已连接原因:Connection_Ok   IoTHub连接现在是Disconnected_Retrying原因:No_Network   IoTHub连接现在已连接原因:Connection_Ok   IoTHub连接现在是Disconnected_Retrying原因:No_Network   IoTHub连接现在已连接原因:Connection_Ok   IoTHub连接现在是Disconnected_Retrying Reason:No_Network

我使用dotPeek反编译Microsoft.Azure.Devices的东西并通过本地pdb服务器提供它。似乎正在发生的事情是某些东西正在为成功的操作生成SocketException。异常消息是“操作成功完成”。此博客表明这通常是由于dllimport调用未使用SetLastError。我没有在callstack中看到任何明显导致pinvoke调用的内容:

  

at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()      在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)      在Microsoft.Azure.Devices.Client.Transport.Mqtt.MqttIotHubAdapter.d__40.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束---      在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()      在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)      在Microsoft.Azure.Devices.Client.Transport.Mqtt.MqttIotHubAdapter.d__28.MoveNext()

1 个答案:

答案 0 :(得分:-2)

通常,在Console应用程序或服务方案中工作时,没有安装SynchronizationContext(默认情况下),因此ConfigureAwait中的continueOnCapturedContext选项将不起作用。但是,如果您碰巧安装或使用安装< em> SynchronizationContext ,异步方法的行为将类似于UI应用程序。 ConfigureAwait(false)将更改上下文。一个重要的规则是每个异步方法都有自己的上下文,这意味着调用方法不受 ConfigureAwait 的影响。您可以参考这些主题以获取有关 Task.ConfigureAwait 的详细信息。