diff --git a/OpenRA.FileFormats/OpenRA.FileFormats.csproj b/OpenRA.FileFormats/OpenRA.FileFormats.csproj
index 5955859895..bc3969d97d 100644
--- a/OpenRA.FileFormats/OpenRA.FileFormats.csproj
+++ b/OpenRA.FileFormats/OpenRA.FileFormats.csproj
@@ -75,6 +75,7 @@
+
diff --git a/OpenRA.FileFormats/Primitives/ActionQueue.cs b/OpenRA.FileFormats/Primitives/ActionQueue.cs
new file mode 100644
index 0000000000..9ed04c0f86
--- /dev/null
+++ b/OpenRA.FileFormats/Primitives/ActionQueue.cs
@@ -0,0 +1,40 @@
+#region Copyright & License Information
+/*
+ * Copyright 2007-2010 The OpenRA Developers (see AUTHORS)
+ * This file is part of OpenRA, which is free software. It is made
+ * available to you under the terms of the GNU General Public License
+ * as published by the Free Software Foundation. For more information,
+ * see LICENSE.
+ */
+#endregion
+
+using System;
+
+namespace OpenRA.FileFormats
+{
+ ///
+ /// A thread-safe action queue, suitable for passing units of work between threads.
+ ///
+ public class ActionQueue
+ {
+ object syncRoot = new object();
+ Action actions = () => { };
+
+ public void Add(Action a)
+ {
+ lock (syncRoot)
+ actions += a;
+ }
+
+ public void PerformActions()
+ {
+ Action a;
+ lock (syncRoot)
+ {
+ a = actions;
+ actions = () => { };
+ }
+ a();
+ }
+ }
+}
diff --git a/OpenRA.Game/Game.cs b/OpenRA.Game/Game.cs
index 259a074c2a..3950b024c5 100755
--- a/OpenRA.Game/Game.cs
+++ b/OpenRA.Game/Game.cs
@@ -101,10 +101,10 @@ namespace OpenRA
{
return Widget.OpenWindow(widget, new Dictionary{{ "world", world }, { "orderManager", orderManager }, { "worldRenderer", worldRenderer }});
}
-
- static object syncroot = new object();
- static Action tickActions = () => {};
- public static void RunAfterTick(Action a) { lock(syncroot) tickActions += a; }
+
+ static ActionQueue afterTickActions = new ActionQueue();
+ public static void RunAfterTick(Action a) { afterTickActions.Add(a); }
+
static void Tick( OrderManager orderManager, Viewport viewPort )
{
if (orderManager.Connection.ConnectionState != lastConnectionState)
@@ -128,9 +128,8 @@ namespace OpenRA
PerfHistory.items["batches"].Tick();
MasterServerQuery.Tick();
- Action a;
- lock(syncroot) { a = tickActions; tickActions = () => {}; }
- a();
+
+ afterTickActions.PerformActions();
}
private static void Tick( OrderManager orderManager )