C # запустить статический поток - PullRequest
1 голос
/ 30 января 2011

У меня есть очередь элементов, которые я хочу обработать в потоке, и любой экземпляр класса может добавлять элементы в очередь для обработки.

Моя идея заключается в том, чтобы иметь статический потокв классе, который обрабатывает элементы, единственная проблема в том, что я не знаю, где запустить этот поток, так как я не могу запустить его при инициализации.

Есть ли способ, которым я могу запустить статическийнить?Или я должен полностью изменить архитектуру?

Ответы [ 2 ]

5 голосов
/ 30 января 2011

Вы можете запустить его в статическом конструкторе для класса:

private class MyClass
{
   static MyClass()
   {
      // start thread here
   }
}

Вы также можете запустить его в обычном конструкторе класса, используя типичный одноэлементный подход.

Или вы можете использовать новый подход .NET 4 Lazy<T> для его создания и запуска.

НО, как правило, не рекомендуется выполнять работу в конструкторах классов. Лучшим подходом было бы убедиться, что поток существует только тогда, когда кто-то вызывает, скажем, Execute() в экземпляре класса. В методе Execute вы можете использовать Lazy<T> или одноэлементный подход для создания и запуска экземпляра одного потока, который будет его обрабатывать.

Пуристы укажут, что на самом деле вы, вероятно, вообще не хотите этого делать и что подход Factory может быть лучше для создания экземпляров вашего класса, и что вам следует разделить проблемы между вашим классом и работником, который его обрабатывает. .

Другой предполагает, что вам вообще не нужен поток, просто используйте .NET4 Task s и поставьте в очередь элементы для выполнения, используя предоставленные платформой методы queue / execute.

2 голосов
/ 30 января 2011

Дайте статическому классу очереди, что у вас есть закрытый внутренний класс, который обрабатывает фактическую многопоточность:

static class QueueStatic
{
    public static Queue<Object> queue;
    private static QueueWorker worker;

    public static void DoQueueAction()
    {
        worker = new QueueWorker(queue);
        ThreadStart t = new ThreadSTart(worker.Work);
        t.Start();
    }

    //inner class
    private class QueueWorker
    {
        private Queue<Object> queue;
        public QueueWorker(Queue<Object> queue)
        {
            this.queue = queue;
        }

        public void Work()
        {
            //...
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...