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