/*
Kooboo is a content management system based on ASP.NET MVC framework. Copyright 2009 Yardi Technology Limited.
This program is free software: you can redistribute it and/or modify it under the terms of the
GNU General Public License version 3 as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with this program.
If not, see http://www.kooboo.com/gpl3/.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Everest.Library.Net{
public class ThreadBlocker
{
/// <summary>
/// ThreadBlocker Constructor.
/// </summary>
public ThreadBlocker()
: this(null)
{
}
/// <summary>
/// ThreadBlocker Constructor.
/// </summary>
/// <param name="releaseCondition">
/// Return boolean value 'true' to release block.
/// </param>
public ThreadBlocker(Func<bool> releaseCondition)
{
this.ReleaseCondition = releaseCondition;
}
// release codition function.
private Func<bool> ReleaseCondition;
// released flag.
private bool isReleased;
// default inquire timespan, 100 millisecond.
private const int _inquireTime = 100;
// default to one minute.
private int _timeOut = 60 * 1000;
/// <summary>
/// Wait timeout(millisecond).
/// </summary>
public int Timeout
{
get { return _timeOut; }
set { _timeOut = value; }
}
/// <summary>
/// Wait core.
/// </summary>
public void Wait()
{
var totalTime = 0;
isReleased = false;
while ((isReleased == false) && (totalTime < this.Timeout) &&
((this.ReleaseCondition == null) || (!this.ReleaseCondition())))
{
totalTime += _inquireTime;
Thread.Sleep(_inquireTime);
}
}
/// <summary>
/// Release blocker.
/// </summary>
public void Release()
{
isReleased = true;
}
/// <summary>
/// Block current thread.
/// </summary>
/// <param name="timeout">Wait timeout(millisecond).</param>
public static ThreadBlocker Wait(int timeout)
{
return Wait(timeout, null);
}
/// <summary>
/// Block current thread.
/// </summary>
/// <param name="timeout">Wait timeout(millisecond).</param>
/// <param name="releaseCondition">
/// Return boolean value 'true' to release block.
/// </param>
public static ThreadBlocker Wait(int timeout, Func<bool> releaseCondition)
{
var blocker = new ThreadBlocker(releaseCondition);
blocker.Timeout = timeout;
blocker.Wait();
return blocker;
}
}
}
|