2016-03-21 4 views
0

Я просто написал этот код вручную:.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» (т. Е. Ошибки) в коде, который я только что опубликовал?

+1

А «один поток ThreadPool» кажется немного противоречия. :) – CodingGorilla

+3

«Я использую его, чтобы гарантировать, что все выполнение определенной категории задач всегда выполняется одним потоком». Просто почему ? –

+0

Я думаю, что ваш подход прекрасен (Но я бы использовал 'Задача', созданную' Thread' + 'tasks.GetConsumingEnumerable()' и 'tasks.CompleteAdding' вместо добавления нулевого действия для завершения) – Eser

ответ

0

Для этого я использовал бы реактивную платформу Microsoft (NuGet «Rx-Main»).

Это в основном код:

class SingleWorkerThread : IDisposable 
{ 
    private Subject<Action> _subject; 
    private IScheduler _scheduler; 
    private IDisposable _subscription; 

    private static readonly ILog _logger = LogManager.GetLogger(typeof(SingleWorkerThread)); 

    public SingleWorkerThread() 
    { 
     _scheduler = new EventLoopScheduler() 
     _subject = new Subject<Action>(); 
     _subscription = 
      _subject 
       .ObserveOn(_scheduler) 
       .Subscribe(task => 
       { 
        _logger.InfoFormat("About to execute a task...", task); 
        task(); 
        _logger.InfoFormat("Completed executing task"); 
       }); 
    } 

    public void Dispose() 
    { 
     _subscription.Dispose(); 
    } 

    public void AddTask(Action Action) 
    { 
     _subject.OnNext(Action); 
    } 
} 
Смежные вопросы