AsyncCalls – Asynchronous function calls

There will be no further development.

With AsyncCalls you can execute multiple functions at the same time and synchronize them at every point in the function or method that started them. This allows you to execute time consuming code whos result is needed at a later time in a different thread. While the asynchronous function is executed the caller function can do other tasks.

The AsyncCalls unit offers a variety of function prototypes to call asynchronous functions. There are functions that can call asynchronous functions with one single parameter of the type: TObject, Integer, AnsiString, WideString, IInterface, Extended and Variant. Another function allows you to transfer a user defined value type (record) to the asynchronous function where it can be modify. And there are functions that can call asynchronous functions with a variable number of arguments. The arguments are specified in an const array of const and are automatically mapped to normal function arguments.

Inlined VCL/main thread synchronization isĀ supported starting with version 2.0. With this you can implement the code that calls a VCL function directly in your thread method without having to use a helper method and TThread.Synchronize. You have full access to all local variables.
Version 2.9 introduces the TAsyncCalls class that utilizes generics and anonymous methods (Delphi 2009 or newer).

The AsyncCalls unit is licensed under the Mozilla Public Licence (“MPL”) version 1.1.

Extract the to a directory of your choice. Add the AnyncCalls.pas unit to your project and uses statements.

Works with Delphi 5 – 10.1 Berlin. (Win32, Win64)


Name IDE Version File Size Downloads Added
AsyncCalls 2.99.1 5-10.1 Berlin 35.82 KB 3473 times 2016-08-15


  • Version: 2.99.1 (2016-08-13):
    • Fixed: Race condition in “Forget” code
  • Version: 2.99 (2011-12-14):
    • Added: IAsyncCall.CancelInvocation method
    • Added: IAsyncCall.Forget method
  • Version: 2.98 (2011-10-22)
    • Added: Support for XE2 64 bit.
  • Version: 2.97 (2011-06-13)
    • Fixed: The thread priority wasn’t reset to Normal for new AsyncCall tasks.
    • Replaced Suspend/Resume code to prevent a race condition where all threads are suspended but their FSuspended flag is false.
    • Exception handling in TAsyncCall.InternExecuteSyncCall. Quit() wasn’t called after an exception was raised.
  • Version: 2.96 (2010-09-12)
    • Added: Support for RAD Studio XE
    • Added: Support for UnicodeString
    • Fixed: CoInitialize wasn’t called
  • Version: 2.92 (2009-08-30)
    • Added: Support for RAD Studio 2010
    • Restored: Delphi 2009 Update 1 fixed the compiler bug. All generic methods are now available.
  • Version 2.91 (2008-09-29)
    • Fixed: All generic methods are now disabled due to an internal compiler error in Delphi 2009
  • Version 2.9 (2008-09-27)
    • Fixed: Window message handling
    • Added: Delphi 2009 support with generics and anonymous methods
    • Added: AsyncCall(Runnable: IAsyncRunnable)
  • Version 2.21 (2008-05-14)
    • Fixed: Bug in AsyncMultiSync
  • Version 2.2 (2008-05-12)
    • Fixed: Bugs in main thread AsyncMultiSync implementation
    • Added: Delphi 5 support
  • Version 2.1 (2008-05-06)
    • Added: Delphi 6 support
    • Added: Support for “Exit;” in the MainThread block
    • Fixed: Exception handling for Delphi 6, 7 and 2005
    • Fixed: EBX, ESI and ESI are now copied into the synchronized block (Self-Pointer)
  • Version 2.0 (2008-05-04)
    • Added: EnterMainThread/LeaveMainThread
    • Added: LocalVclCall, LocalAsyncVclCall, MsgAsyncMultiSync
    • Added: LocalAsyncExec, AsyncExec
    • Added: IAsyncCall.ForceDifferentThread
    • Fixed: Exception handling
    • Removed: Delphi 5 and 6 support
  • Version 1.2 (2008-02-10)
    • Added CoInitialize for the threads
    • LocalAsyncCall functio
    • Exception handling
  • Version 1.1 (2007-08-14)
    • Workaround for TThread.Resume bug
  • Version 1.0 (2006-12-23)
    • Fixed: Exception where Thread was destroyed while the finalization code accessed it.