diff --git a/ConsoleMenu/ConsoleMenu.cs b/ConsoleMenu/ConsoleMenu.cs
index f3f72d0..c193604 100644
--- a/ConsoleMenu/ConsoleMenu.cs
+++ b/ConsoleMenu/ConsoleMenu.cs
@@ -2,6 +2,8 @@
 using System.Collections;
 using System.Collections.Generic;
 using System.Runtime.CompilerServices;
+using System.Threading;
+using System.Threading.Tasks;
 
 [assembly: InternalsVisibleTo("ConsoleMenuTests")]
 
@@ -68,7 +70,7 @@ private IReadOnlyList<string> Titles
     get
     {
       ConsoleMenu? current = this;
-      List<string> titles = new List<string>();
+      List<string> titles = new();
       while (current != null)
       {
         titles.Add(current.config.Title ?? "");
@@ -83,7 +85,10 @@ private IReadOnlyList<string> Titles
   /// <summary>
   /// Don't run this method directly. Just pass a reference to this method.
   /// </summary>
-  public static void Close() => throw new InvalidOperationException("Don't run this method directly. Just pass a reference to this method.");
+  /// <param name="cancellationToken">Cancellation token.</param>
+  /// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
+  /// <exception cref="InvalidOperationException">Thrown if this method is called directly.</exception>
+  public static Task Close(CancellationToken cancellationToken) => throw new InvalidOperationException("Don't run this method directly. Just pass a reference to this method.");
 
   /// <summary>
   /// Close the menu before or after a menu action was triggered.
@@ -94,7 +99,7 @@ public void CloseMenu()
   }
 
   /// <summary>
-  /// Adds a menu item into this instance.
+  /// Adds a menu action into this instance.
   /// </summary>
   /// <param name="name">Name of menu item.</param>
   /// <param name="action">Action to call when menu item is chosen.</param>
@@ -116,12 +121,43 @@ public ConsoleMenu Add(string name, Action action)
       child.parent = this;
     }
 
+    this.menuItems.Add(name, (_) =>
+    {
+      action();
+      return Task.CompletedTask;
+    });
+    return this;
+  }
+
+  /// <summary>
+  /// Adds an asynchronous menu action into this instance.
+  /// </summary>
+  /// <param name="name">Name of menu item.</param>
+  /// <param name="action">Action to call when menu item is chosen.</param>
+  /// <returns>This instance with added menu item.</returns>
+  public ConsoleMenu Add(string name, Func<CancellationToken, Task> action)
+  {
+    if (name == null)
+    {
+      throw new ArgumentNullException(nameof(name));
+    }
+
+    if (action == null)
+    {
+      throw new ArgumentNullException(nameof(action));
+    }
+
+    if (action.Target is ConsoleMenu child && action == child.ShowAsync)
+    {
+      child.parent = this;
+    }
+
     this.menuItems.Add(name, action);
     return this;
   }
 
   /// <summary>
-  /// Adds a menu item into this instance.
+  /// Adds a menu action into this instance.
   /// </summary>
   /// <param name="name">Name of menu item.</param>
   /// <param name="action">Action to call when menu item is chosen.</param>
@@ -138,12 +174,38 @@ public ConsoleMenu Add(string name, Action<ConsoleMenu> action)
       throw new ArgumentNullException(nameof(action));
     }
 
-    this.menuItems.Add(name, () => action(this));
+    this.menuItems.Add(name, (_) =>
+    {
+      action(this);
+      return Task.CompletedTask;
+    });
+    return this;
+  }
+
+  /// <summary>
+  /// Adds an asynchronous menu action into this instance.
+  /// </summary>
+  /// <param name="name">Name of menu item.</param>
+  /// <param name="action">Action to call when menu item is chosen.</param>
+  /// <returns>This instance with added menu item.</returns>
+  public ConsoleMenu Add(string name, Func<ConsoleMenu, CancellationToken, Task> action)
+  {
+    if (name == null)
+    {
+      throw new ArgumentNullException(nameof(name));
+    }
+
+    if (action is null)
+    {
+      throw new ArgumentNullException(nameof(action));
+    }
+
+    this.menuItems.Add(name, (cancellationToken) => action(this, cancellationToken));
     return this;
   }
 
   /// <summary>
-  /// Adds range of menu items into this instance.
+  /// Adds range of menu actions into this instance.
   /// </summary>
   /// <param name="menuItems">Menu items to add.</param>
   /// <returns>This instance with added menu items.</returns>
@@ -162,6 +224,26 @@ public ConsoleMenu AddRange(IEnumerable<Tuple<string, Action>> menuItems)
     return this;
   }
 
+  /// <summary>
+  /// Adds range of asynchronous menu actions into this instance.
+  /// </summary>
+  /// <param name="menuItems">Menu items to add.</param>
+  /// <returns>This instance with added menu items.</returns>
+  public ConsoleMenu AddRange(IEnumerable<Tuple<string, Func<CancellationToken, Task>>> menuItems)
+  {
+    if (menuItems is null)
+    {
+      throw new ArgumentNullException(nameof(menuItems));
+    }
+
+    foreach (var item in menuItems)
+    {
+      this.Add(item.Item1, item.Item2);
+    }
+
+    return this;
+  }
+
   /// <summary>
   /// Applies an configuration action on this instance.
   /// </summary>
@@ -206,7 +288,20 @@ public void Show()
         this.Console,
         new List<string>(this.Titles),
         this.config,
-        this.closeTrigger).Show();
+        this.closeTrigger).ShowAsync(CancellationToken.None).GetAwaiter().GetResult();
+  }
+
+  /// <summary>
+  /// Displays the menu in console.
+  /// </summary>
+  public async Task ShowAsync(CancellationToken cancellationToken = default)
+  {
+    await new ConsoleMenuDisplay(
+        this.menuItems,
+        this.Console,
+        new List<string>(this.Titles),
+        this.config,
+        this.closeTrigger).ShowAsync(cancellationToken);
   }
 
   /// <summary>
diff --git a/ConsoleMenu/ConsoleMenu.csproj b/ConsoleMenu/ConsoleMenu.csproj
index 97cfa1b..b7e33d8 100644
--- a/ConsoleMenu/ConsoleMenu.csproj
+++ b/ConsoleMenu/ConsoleMenu.csproj
@@ -6,11 +6,10 @@
     <Authors>lechu445</Authors>
     <Product>ConsoleMenu-simple</Product>
     <Description>A simple, highly customizable, DOS-like console menu</Description>
-    <PackageReleaseNotes>- added collection initializer
-- added ConsoleMenu.Configure(MenuConfig config)</PackageReleaseNotes>
+    <PackageReleaseNotes>- added async API</PackageReleaseNotes>
     <PackageProjectUrl>https://github.com/lechu445/ConsoleMenu</PackageProjectUrl>
     <PublishRepositoryUrl>true</PublishRepositoryUrl>
-    <Version>2.5.0</Version>
+    <Version>2.6.0</Version>
     <RepositoryUrl>https://github.com/lechu445/ConsoleMenu</RepositoryUrl>
     <PackageTags>console, menu, simple</PackageTags>
     <PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
@@ -38,7 +37,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.CodeAnalysis.PublicApiAnalyzers" Version="3.3.3">
+    <PackageReference Include="Microsoft.CodeAnalysis.PublicApiAnalyzers" Version="3.3.4">
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
     </PackageReference>
diff --git a/ConsoleMenu/ConsoleMenuDisplay.cs b/ConsoleMenu/ConsoleMenuDisplay.cs
index 21b7466..94f2390 100644
--- a/ConsoleMenu/ConsoleMenuDisplay.cs
+++ b/ConsoleMenu/ConsoleMenuDisplay.cs
@@ -1,6 +1,8 @@
 ﻿using System;
 using System.Collections.Generic;
 using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
 
 namespace ConsoleTools;
 
@@ -30,12 +32,12 @@ public ConsoleMenuDisplay(
     this.noSelectorLine = new string(' ', this.config.Selector.Length);
   }
 
-  public void Show()
+  public async Task ShowAsync(CancellationToken token)
   {
     var selectedItem = this.menuItems.GetSeletedItem();
     if (selectedItem != null)
     {
-      selectedItem.Action.Invoke();
+      await selectedItem.AsyncAction.Invoke(token);
       return;
     }
 
@@ -48,6 +50,7 @@ public void Show()
 
     while (true)
     {
+      token.ThrowIfCancellationRequested();
       do
       {
         if (this.config.ClearConsole)
@@ -137,7 +140,7 @@ public void Show()
       this.console.WriteLine();
       this.console.ForegroundColor = currentForegroundColor;
       this.console.BackgroundColor = currentBackgroundColor;
-      var action = this.menuItems.CurrentItem.Action;
+      var action = this.menuItems.CurrentItem.AsyncAction;
       if (action == ConsoleMenu.Close)
       {
         this.menuItems.UnsetSelectedIndex();
@@ -145,7 +148,7 @@ public void Show()
       }
       else
       {
-        action();
+        await action(token).ConfigureAwait(false);
         if (this.closeTrigger.IsOn())
         {
           this.menuItems.UnsetSelectedIndex();
diff --git a/ConsoleMenu/ItemsCollection.cs b/ConsoleMenu/ItemsCollection.cs
index cb07360..a4f1895 100644
--- a/ConsoleMenu/ItemsCollection.cs
+++ b/ConsoleMenu/ItemsCollection.cs
@@ -1,5 +1,7 @@
 ﻿using System;
 using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
 
 namespace ConsoleTools;
 
@@ -28,7 +30,7 @@ public MenuItem CurrentItem
     set => this.menuItems[this.currentItemIndex] = value;
   }
 
-  public void Add(string name, Action action)
+  public void Add(string name, Func<CancellationToken, Task> action)
   {
     this.menuItems.Add(new MenuItem(name, action, this.menuItems.Count));
   }
diff --git a/ConsoleMenu/MenuConfig.cs b/ConsoleMenu/MenuConfig.cs
index bdf5a95..0dc250f 100644
--- a/ConsoleMenu/MenuConfig.cs
+++ b/ConsoleMenu/MenuConfig.cs
@@ -1,41 +1,41 @@
-﻿#pragma warning disable SA1401 // Fields should be private
+﻿#pragma warning disable SA1401 // Fields should be private
 using System;
 using System.Collections.Generic;
 
 namespace ConsoleTools;
-
-/// <summary>
-/// Menu configuration.
+
+/// <summary>
+/// Menu configuration.
 /// </summary>
 public class MenuConfig
-{
-  /// <summary>
-  /// Initializes a new instance of the <see cref="MenuConfig"/> class.
-  /// </summary>
-  public MenuConfig()
-  {
-  }
-
-  internal MenuConfig(MenuConfig config)
-  {
-    this.ArgsPreselectedItemsKey = config.ArgsPreselectedItemsKey;
-    this.ArgsPreselectedItemsValueSeparator = config.ArgsPreselectedItemsValueSeparator;
-    this.ClearConsole = config.ClearConsole;
-    this.EnableBreadcrumb = config.EnableBreadcrumb;
-    this.EnableFilter = config.EnableFilter;
-    this.EnableWriteTitle = config.EnableWriteTitle;
-    this.FilterPrompt = config.FilterPrompt;
-    this.ItemBackgroundColor = config.ItemBackgroundColor;
-    this.ItemForegroundColor = config.ItemForegroundColor;
-    this.SelectedItemBackgroundColor = config.SelectedItemBackgroundColor;
-    this.SelectedItemForegroundColor = config.SelectedItemForegroundColor;
-    this.Selector = config.Selector;
-    this.Title = config.Title;
-    this.WriteBreadcrumbAction = config.WriteBreadcrumbAction;
-    this.WriteHeaderAction = config.WriteHeaderAction;
-    this.WriteItemAction = config.WriteItemAction;
-    this.WriteTitleAction = config.WriteTitleAction;
-  }
+{
+  /// <summary>
+  /// Initializes a new instance of the <see cref="MenuConfig"/> class.
+  /// </summary>
+  public MenuConfig()
+  {
+  }
+
+  internal MenuConfig(MenuConfig config)
+  {
+    this.ArgsPreselectedItemsKey = config.ArgsPreselectedItemsKey;
+    this.ArgsPreselectedItemsValueSeparator = config.ArgsPreselectedItemsValueSeparator;
+    this.ClearConsole = config.ClearConsole;
+    this.EnableBreadcrumb = config.EnableBreadcrumb;
+    this.EnableFilter = config.EnableFilter;
+    this.EnableWriteTitle = config.EnableWriteTitle;
+    this.FilterPrompt = config.FilterPrompt;
+    this.ItemBackgroundColor = config.ItemBackgroundColor;
+    this.ItemForegroundColor = config.ItemForegroundColor;
+    this.SelectedItemBackgroundColor = config.SelectedItemBackgroundColor;
+    this.SelectedItemForegroundColor = config.SelectedItemForegroundColor;
+    this.Selector = config.Selector;
+    this.Title = config.Title;
+    this.WriteBreadcrumbAction = config.WriteBreadcrumbAction;
+    this.WriteHeaderAction = config.WriteHeaderAction;
+    this.WriteItemAction = config.WriteItemAction;
+    this.WriteTitleAction = config.WriteTitleAction;
+  }
 
   /// <summary>default: Console.ForegroundColor</summary>
   public ConsoleColor SelectedItemBackgroundColor = Console.ForegroundColor;
@@ -47,11 +47,11 @@ internal MenuConfig(MenuConfig config)
   public ConsoleColor ItemBackgroundColor = Console.BackgroundColor;
 
   /// <summary>default: Console.ForegroundColor</summary>
-  public ConsoleColor ItemForegroundColor = Console.ForegroundColor;
-
+  public ConsoleColor ItemForegroundColor = Console.ForegroundColor;
+
   /// <summary>default: () => Console.WriteLine("Pick an option:")</summary>
-  public Action WriteHeaderAction = () => Console.WriteLine("Pick an option:");
-
+  public Action WriteHeaderAction = () => Console.WriteLine("Pick an option:");
+
   /// <summary>default: (item) => Console.Write("[{0}] {1}", item.Index, item.Name)</summary>
   public Action<MenuItem> WriteItemAction = item => Console.Write("[{0}] {1}", item.Index, item.Name);
 
diff --git a/ConsoleMenu/MenuItem.cs b/ConsoleMenu/MenuItem.cs
index 4d9fd74..8eabcbb 100644
--- a/ConsoleMenu/MenuItem.cs
+++ b/ConsoleMenu/MenuItem.cs
@@ -1,5 +1,7 @@
 ﻿using System;
 using System.Diagnostics;
+using System.Threading;
+using System.Threading.Tasks;
 
 namespace ConsoleTools;
 
@@ -8,12 +10,12 @@ namespace ConsoleTools;
 /// </summary>
 public sealed class MenuItem
 {
-  internal MenuItem(string name, Action action, int index)
+  internal MenuItem(string name, Func<CancellationToken, Task> action, int index)
   {
     Debug.Assert(index >= 0);
 
     this.Name = name ?? throw new ArgumentNullException(nameof(name));
-    this.Action = action ?? throw new ArgumentNullException(nameof(action));
+    this.AsyncAction = action ?? throw new ArgumentNullException(nameof(action));
     this.Index = index;
   }
 
@@ -24,8 +26,22 @@ internal MenuItem(string name, Action action, int index)
 
   /// <summary>
   /// Gets or sets an action of the menu item that will be called when the item is called.
+  /// If you get asynchronous action, it will be converted to synchronous, so better use <see cref="AsyncAction"/> getter.
   /// </summary>
-  public Action Action { get; set; }
+  public Action Action
+  {
+    get => () => this.AsyncAction(CancellationToken.None).GetAwaiter().GetResult();
+    set => this.AsyncAction = (_) =>
+    {
+      value();
+      return Task.CompletedTask;
+    };
+  }
+
+  /// <summary>
+  /// Gets or sets an action of the menu item that will be called when the item is called.
+  /// </summary>
+  public Func<CancellationToken, Task> AsyncAction { get; set; }
 
   /// <summary>
   /// Gets an index of the menu item.
diff --git a/ConsoleMenu/PublicAPI.Unshipped.txt b/ConsoleMenu/PublicAPI.Unshipped.txt
index 078cd5e..fd914c4 100644
--- a/ConsoleMenu/PublicAPI.Unshipped.txt
+++ b/ConsoleMenu/PublicAPI.Unshipped.txt
@@ -1,7 +1,10 @@
 ﻿ConsoleTools.ConsoleMenu
 ConsoleTools.ConsoleMenu.Add(string! name, System.Action! action) -> ConsoleTools.ConsoleMenu!
 ConsoleTools.ConsoleMenu.Add(string! name, System.Action<ConsoleTools.ConsoleMenu!>! action) -> ConsoleTools.ConsoleMenu!
+ConsoleTools.ConsoleMenu.Add(string! name, System.Func<ConsoleTools.ConsoleMenu!, System.Threading.CancellationToken, System.Threading.Tasks.Task!>! action) -> ConsoleTools.ConsoleMenu!
+ConsoleTools.ConsoleMenu.Add(string! name, System.Func<System.Threading.CancellationToken, System.Threading.Tasks.Task!>! action) -> ConsoleTools.ConsoleMenu!
 ConsoleTools.ConsoleMenu.AddRange(System.Collections.Generic.IEnumerable<System.Tuple<string!, System.Action!>!>! menuItems) -> ConsoleTools.ConsoleMenu!
+ConsoleTools.ConsoleMenu.AddRange(System.Collections.Generic.IEnumerable<System.Tuple<string!, System.Func<System.Threading.CancellationToken, System.Threading.Tasks.Task!>!>!>! menuItems) -> ConsoleTools.ConsoleMenu!
 ConsoleTools.ConsoleMenu.CloseMenu() -> void
 ConsoleTools.ConsoleMenu.Configure(ConsoleTools.MenuConfig! config) -> ConsoleTools.ConsoleMenu!
 ConsoleTools.ConsoleMenu.Configure(System.Action<ConsoleTools.MenuConfig!>! configure) -> ConsoleTools.ConsoleMenu!
@@ -34,7 +37,9 @@ ConsoleTools.MenuConfig.WriteTitleAction -> System.Action<string!>!
 ConsoleTools.MenuItem
 ConsoleTools.MenuItem.Action.get -> System.Action!
 ConsoleTools.MenuItem.Action.set -> void
+ConsoleTools.MenuItem.AsyncAction.get -> System.Func<System.Threading.CancellationToken, System.Threading.Tasks.Task!>!
+ConsoleTools.MenuItem.AsyncAction.set -> void
 ConsoleTools.MenuItem.Index.get -> int
 ConsoleTools.MenuItem.Name.get -> string!
 ConsoleTools.MenuItem.Name.set -> void
-static ConsoleTools.ConsoleMenu.Close() -> void
\ No newline at end of file
+static ConsoleTools.ConsoleMenu.Close(System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
\ No newline at end of file
diff --git a/ConsoleMenuSampleApp/Program.cs b/ConsoleMenuSampleApp/Program.cs
index a23d3cd..c6dd7d5 100644
--- a/ConsoleMenuSampleApp/Program.cs
+++ b/ConsoleMenuSampleApp/Program.cs
@@ -1,11 +1,13 @@
 ﻿using System;
+using System.Threading;
+using System.Threading.Tasks;
 using ConsoleTools;
 
 namespace ConsoleMenuSampleApp
 {
   public class Program
   {
-    private static void Main(string[] args)
+    private static async Task Main(string[] args)
     {
       var commonConfig = new MenuConfig
       {
@@ -30,6 +32,7 @@ private static void Main(string[] args)
         .Add("Sub_Two", () => SomeAction("Sub_Two"))
         .Add("Sub_Three", () => SomeAction("Sub_Three"))
         .Add("Sub_Four", () => SomeAction("Sub_Four"))
+        .Add("Sub_Five", async (cancellationToken) => await SomeAction2(cancellationToken))
         .Add("Sub_Close", ConsoleMenu.Close)
         .Add("Sub_Action then Close", (thisMenu) => { SomeAction("Closing action..."); thisMenu.CloseMenu(); })
         .Add("Sub_Exit", () => Environment.Exit(0))
@@ -56,7 +59,8 @@ private static void Main(string[] args)
           config.EnableBreadcrumb = true;
         });
 
-      menu.Show();
+      var token = new CancellationTokenSource(7000).Token;
+      await menu.ShowAsync(token);
     }
 
     private static void SomeAction(string text)
@@ -65,5 +69,14 @@ private static void SomeAction(string text)
       Console.WriteLine("Press any key to continue...");
       Console.ReadKey();
     }
+
+    private static async Task SomeAction2(CancellationToken token)
+    {
+      Console.WriteLine("start delay...");
+      await Task.Delay(2000, token);
+      Console.WriteLine("end delay");
+      Console.WriteLine("Press any key to continue...");
+      Console.ReadKey();
+    }
   }
 }
diff --git a/ConsoleMenuTests/ConsoleMenuTests.csproj b/ConsoleMenuTests/ConsoleMenuTests.csproj
index d7f1d6f..641c347 100644
--- a/ConsoleMenuTests/ConsoleMenuTests.csproj
+++ b/ConsoleMenuTests/ConsoleMenuTests.csproj
@@ -8,9 +8,9 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.9.4" />
-    <PackageReference Include="xunit" Version="2.4.1" />
-    <PackageReference Include="xunit.runner.visualstudio" Version="2.4.3">
+    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.4.1" />
+    <PackageReference Include="xunit" Version="2.4.2" />
+    <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
     </PackageReference>
