@Override
  public void loadAsyncVariablesValues(@Nullable XStackFrame contextFrame, final @NotNull List<PyAsyncValue<String>> pyAsyncValues) {
    PyDebugValueExecutionService.getInstance(getProject()).submitTask(this, () -> {
      try {
        if (isConnected()) {
          final PyStackFrame frame = contextFrame == null ? currentFrame() : (PyStackFrame)contextFrame;
          XSuspendContext context = getSession().getSuspendContext();
          String threadId = threadIdBeforeResumeOrStep(context);
          for (PyThreadInfo suspendedThread : mySuspendedThreads) {
            if (threadId == null || threadId.equals(suspendedThread.getId())) {
              myDebugger.loadFullVariableValues(frame.getThreadId(), frame.getFrameId(), pyAsyncValues);
              break;
            }
          }
        }
      }
      catch (PyDebuggerException e) {
        if (!isConnected()) return;
        for (PyAsyncValue<String> asyncValue : pyAsyncValues) {
          PyDebugValue value = asyncValue.getDebugValue();
          for (XValueNode node : value.getValueNodes()) {
            if (node != null && !node.isObsolete()) {
              if (e.getMessage().startsWith("Timeout")) {
                value.updateNodeValueAfterLoading(node, " ", "", PyBundle.message("debugger.variables.view.loading.timed.out"));
                ConfigureTypeRenderersHyperLink configureLink = new ConfigureTypeRenderersHyperLink(null, getProject(), value);
                if (node instanceof XValueNodeImpl valueNode) {
                  valueNode.clearAdditionalHyperlinks();
                  valueNode.addAdditionalHyperlink(configureLink);
                }
              }
              else {
                LOG.error(e);
              }
            }
          }
        }
      }
    });
  }
@Override
  public void loadAsyncVariablesValues(@Nullable XStackFrame contextFrame, final @NotNull List<PyAsyncValue<String>> pyAsyncValues)