Hello,

Implemented the suggested change, please see patch below.  Tests pass:

~~~
Only running tests that match:  *
Skipping test files that match:  l.*.test
Only sourcing test files that match:  *.test
Tests began at Fri Aug 10 11:57:28 CEST 2018
Thread 2.8.0
Mainthread id is tid0x7fff8e159380
thread.test
tkt-84be1b5a73.test

tpool.test
tsv.test
ttrace.test

Tests ended at Fri Aug 10 11:57:43 CEST 2018
all.tcl:        Total   136     Passed  120     Skipped 16      Failed  0
Sourced 0 Test Files.
Number of tests skipped for each constraint:
        8       have_gdbm
        8       have_lmdb
~~~

~~~
diff --git
index 9744230c3..b9af96475 100644
---
+++
@@ -343,9 +343,6 @@ ThreadErrorProc(Tcl_Interp *interp);
 static void
 ThreadFreeProc(ClientData clientData);

-static void
-ThreadIdleProc(ClientData clientData);
-
 static void
 ThreadExitProc(ClientData clientData);

@@ -2697,21 +2694,13 @@ ThreadSend(interp, thrId, send, clbk, flags)
     }

     /*
-     * Short circuit sends to ourself.
+     * Short circuit synchronous sends to ourself.
      */
-
-    if (thrId == Tcl_GetCurrentThread()) {
+    if (thrId == Tcl_GetCurrentThread() && (flags & THREAD_SEND_WAIT)) {
         Tcl_MutexUnlock(&threadMutex);
-        if ((flags & THREAD_SEND_WAIT)) {
-            int code = (*send->execProc)(interp, (ClientData)send);
-            ThreadFreeProc((ClientData)send);
-            return code;
-        } else {
-            send->interp = interp;
-            Tcl_Preserve((ClientData)send->interp);
-            Tcl_DoWhenIdle((Tcl_IdleProc*)ThreadIdleProc, (ClientData)send);
-            return TCL_OK;
-        }
+        int code = (*send->execProc)(interp, (ClientData)send);
+        ThreadFreeProc((ClientData)send);
+        return code;
     }

     /*
@@ -3462,34 +3451,6 @@ ThreadSetOption(interp, thrId, option, value)
     return TCL_OK;
 }

-/*
- *----------------------------------------------------------------------
- *
- * ThreadIdleProc --
- *
- * Results:
- *
- * Side effects.
- *
- *----------------------------------------------------------------------
- */
-
-static void
-ThreadIdleProc(clientData)
-    ClientData clientData;
-{
-    int ret;
-    ThreadSendData *sendPtr = (ThreadSendData*)clientData;
-
-    ret = (*sendPtr->execProc)(sendPtr->interp, (ClientData)sendPtr);
-    if (ret != TCL_OK) {
-        ThreadErrorProc(sendPtr->interp);
-    }
-
-    Tcl_Release((ClientData)sendPtr->interp);
-    ThreadFreeProc(clientData);
-}
-
 /*
  *----------------------------------------------------------------------
  *
~~~