diff --git a/ICD.Common.Utils.Tests/ThreadingUtilsTest.cs b/ICD.Common.Utils.Tests/ThreadingUtilsTest.cs
index 40d1722..f0f8c0f 100644
--- a/ICD.Common.Utils.Tests/ThreadingUtilsTest.cs
+++ b/ICD.Common.Utils.Tests/ThreadingUtilsTest.cs
@@ -4,8 +4,25 @@ using NUnit.Framework;
namespace ICD.Common.Utils.Tests
{
[TestFixture]
- public sealed class ThreadingUtilsTest
- {
+ public sealed class ThreadingUtilsTest
+ {
+ [Test]
+ public static void WaitTest()
+ {
+ Assert.IsFalse(ThreadingUtils.Wait(() => false, 100));
+ Assert.IsTrue(ThreadingUtils.Wait(() => true, 100));
+
+ bool complete = false;
+
+ ThreadingUtils.SafeInvoke(() =>
+ {
+ ThreadingUtils.Sleep(50);
+ complete = true;
+ });
+
+ Assert.IsTrue(ThreadingUtils.Wait(() => complete, 100));
+ }
+
[Test]
public void Sleep()
{
@@ -20,7 +37,11 @@ namespace ICD.Common.Utils.Tests
public void SafeInvokeTest()
{
bool result = false;
- ThreadingUtils.SafeInvoke(() => { ThreadingUtils.Sleep(100); result = true; });
+ ThreadingUtils.SafeInvoke(() =>
+ {
+ ThreadingUtils.Sleep(100);
+ result = true;
+ });
Assert.IsFalse(result);
ThreadingUtils.Sleep(1000);
@@ -31,7 +52,11 @@ namespace ICD.Common.Utils.Tests
public void SafeInvokeParamTest()
{
bool result = false;
- ThreadingUtils.SafeInvoke(p => { ThreadingUtils.Sleep(100); result = p; }, true);
+ ThreadingUtils.SafeInvoke(p =>
+ {
+ ThreadingUtils.Sleep(100);
+ result = p;
+ }, true);
Assert.IsFalse(result);
ThreadingUtils.Sleep(1000);
diff --git a/ICD.Common.Utils/ThreadingUtils.cs b/ICD.Common.Utils/ThreadingUtils.cs
index 8bb7b10..20e0882 100644
--- a/ICD.Common.Utils/ThreadingUtils.cs
+++ b/ICD.Common.Utils/ThreadingUtils.cs
@@ -12,6 +12,28 @@ namespace ICD.Common.Utils
{
public static class ThreadingUtils
{
+ ///
+ /// Wait until the given condition is true.
+ ///
+ ///
+ ///
+ ///
+ public static bool Wait(Func condition, long timeout)
+ {
+ if (condition == null)
+ throw new ArgumentNullException("condition");
+
+ DateTime end = IcdEnvironment.GetLocalTime().AddMilliseconds(timeout);
+
+ while (!condition())
+ {
+ if (IcdEnvironment.GetLocalTime() >= end)
+ return false;
+ }
+
+ return true;
+ }
+
///
/// Puts the current thread to sleep for the given amount of time.
///