ThreadManager
アプリケーション中に作成されたスレッドを処理するオブジェクトを作成しようとしています。
全体の目的は、メインForm
を閉じる前にスレッドを終了し、その終了時間中に新しいスレッドを作成できないようにすることです。ご覧のとおり、スレッド作成コード全体と内部にもロックを適用していますAllowNewThreads
。
2つ以上の新しいスレッドがロックを待機することがあると確信しています。これはそれほど悪いことではありませんが、わずかな遅延が発生する可能性があります。より良い結果を得るために、またはおそらく私がまだ検討していない別の戦略を得るために、ロック配置の別の代替案がありますか?
public class ThreadManager
{
#region Fields
private List<Thread> _threads;
private static Logger _logger = LogManager.GetCurrentClassLogger();
private static object _lock;
private bool _allowNewThreads;
#endregion
#region Properties
public bool AllowNewThreads
{
get
{
return _allowNewThreads;
}
set
{
lock (_lock)
{
_allowNewThreads = value;
}
}
}
public int CountAlive
{
get
{
int count = (from t in _threads where (t.IsAlive) select t).Count();
return count;
}
}
#endregion
#region Constructors
private ThreadManager()
{
_threads = new List<Thread>();
}
public static ThreadManager Instance
{
get { return Singleton<ThreadManager>.Instance; }
}
#endregion
#region Methods
// There must always be thread body in order to create a new thread.
// Thread parameters are the objects that are needed for calculations etc inside the thread and are optional
// Start info is the thread itself parameters needed for its creation, such as the thread name, the apartment state
// and if it's background or not. That information is optional as well.
public bool TryAddThread(ParameterizedThreadStart threadBody, object threadParams, ThreadStartInfo startInfo)
{
bool success = true;
try
{
lock (_lock)
{
if (!AllowNewThreads)
{
throw new Exception("Creation of new threads is denied.");
}
Thread f = new Thread(threadBody);
if (startInfo != null)
{
f.Name = startInfo.Name;
f.SetApartmentState(startInfo.ApartmentState);
f.IsBackground = startInfo.IsBackground;
}
if (threadParams != null)
{
f.Start(threadParams);
}
else
{
f.Start();
}
_threads.Add(f);
}
}
catch (Exception ex)
{
_logger.ErrorException("AddThread", ex);
success = false;
}
return success;
}
#endregion
}