diff --git a/ZeroLevel/Services/Utils/Multiprocessor.cs b/ZeroLevel/Services/Utils/Multiprocessor.cs index ea98c3e..c30dbdb 100644 --- a/ZeroLevel/Services/Utils/Multiprocessor.cs +++ b/ZeroLevel/Services/Utils/Multiprocessor.cs @@ -52,25 +52,38 @@ namespace ZeroLevel.Utils public void Append(T t) => _queue.Add(t); - public void WaitForEmpty() + public bool WaitForEmpty(int timeoutInMs) { - while (_queue.Count > 0) + var start = DateTime.UtcNow; + while (Count > 0) { + if (timeoutInMs > 0) + { + if ((DateTime.UtcNow - start).TotalMilliseconds > timeoutInMs) + { + return false; + } + } Thread.Sleep(100); } + return true; } public void Dispose() { + _is_disposed = true; _queue.CompleteAdding(); - while (_queue.Count > 0 || _tasks_in_progress > 0) + Thread.Yield(); + _queue.Dispose(); + foreach (var thread in _threads) { - Thread.Sleep(100); + try + { + thread.Join(); + thread.Abort(); + } + catch { } } - _is_disposed = true; - Thread.Sleep(1000); // wait while threads exit - foreach (var thread in _threads) thread.Join(); - _queue.Dispose(); } } }