Function call to close dialog

I have an application that interacts with a backend.
If the backend returns an error I display a message, see example below

I have the following code for the dialog

@st.dialog("KVDB Error")
def kvdb_error(message):
    st.write(message)
    if st.button('OK'):
        pass
        ## call to function that closes the dialog

What function should I call on the OK button to close the dialog the same way as is done by pressing the x in the top right corner?

From st.dialog - Streamlit Docs:

To close the modal dialog programmatically, call st.rerun() explicitly inside of the dialog function.

I know this is what the documentation says, but I feel like st.rerun() and escaping the dialog by pressing the top right X or esc don’t have exactly the same behavior. It’s kind of an issue for me since I have a code that is a bit slow at time. On bigger projects, I think you can really feel the difference between “rerun” and “exiting” the dialog.

import time
import streamlit as st


@st.dialog("Example dialog")
def open_dialog():
    if st.button("close"):
        st.rerun()


def main():
    st.header("Minimal example of dialog rerun")
    time.sleep(3)
    if st.button("open dialog"):
        open_dialog()


if __name__ == "__main__":
    main()

Here is a minimal example showing the issue. Pressing the cross show no loading at all, while clicking on the close button go through the 3s sleep and prevent the user for performing any action.

edit: This also a problem if you already have a fragment to prevent recomputing something, youy effectively cannot use a dialog in conjunction with another fragment because of the full rerun constraint.

You are right, they are not exactly the same, but they can feel the same as long as the rerun is fast. However,

I have a code that is a bit slow at time.

If you cancel the dialog, nothing has changed. There is nothing new that needs three seconds to be computed. Such a rerun should be fast. If it is not, there must be room for improvement.