Я просто написал этот код вручную:.Net стандартная библиотека для выполнения одного потока
class SingleWorkerThread
{
private static readonly ILog _logger = LogManager.GetLogger(typeof(SingleWorkerThread));
public readonly BlockingCollection<Action> tasks = new BlockingCollection<Action>();
private readonly Thread thread;
private void executeThread()
{
_logger.InfoFormat("Starting execution");
Action task;
while((task = tasks.Take()) != null)
{
_logger.InfoFormat("About to execute a task...", task);
task();
_logger.InfoFormat("Completed executing task");
}
_logger.InfoFormat("Finished execution");
}
public SingleWorkerThread()
{
thread = new Thread(executeThread);
}
public void Start()
{
thread.Start();
}
public void Terminate()
{
tasks.Add(null);
}
public void AddTask(Action a)
{
tasks.Add(a);
}
public void Join()
{
// Wait up to 2 seconds for thread to terminate.
thread.Join(2000);
}
}
Я использую его, чтобы убедиться, что все выполнение определенной категории задач всегда выполняется в одном потоке.
Я бы хотел, чтобы избежать «повторного изобретательства колеса», если это возможно - существует ли стандартная .Net «очередь для потребления очереди», которую я мог бы использовать вместо вышеуказанного?
Если нет, есть ли какие-либо «gotchas» (т. Е. Ошибки) в коде, который я только что опубликовал?
А «один поток ThreadPool» кажется немного противоречия. :) – CodingGorilla
«Я использую его, чтобы гарантировать, что все выполнение определенной категории задач всегда выполняется одним потоком». Просто почему ? –
Я думаю, что ваш подход прекрасен (Но я бы использовал 'Задача', созданную' Thread' + 'tasks.GetConsumingEnumerable()' и 'tasks.CompleteAdding' вместо добавления нулевого действия для завершения) – Eser