Где должны обрабатываться потоки для метода запроса? - PullRequest
0 голосов
/ 01 марта 2011

Я создал библиотеку классов, в которой есть метод запроса открытых портов, и в некоторых случаях его выполнение может занять до 3 секунд. Если бы я реализовал это в отдельном потоке, было бы это обработано в моем методе класса или это было бы сделано самой высокой сущностью, например главной формой?

Не могли бы вы привести примеры, когда потоки обрабатываются внутри класса?

[EDIT]

Вот метод, о котором идет речь.

 public void QueryOpenPorts(out string[] portNames, out bool[] isOpen)
    {
        // get valid ports on computer
        portNames = QueryPortNames();
        // number of ports
        int count = portNames.Length;
        // initialise isOpen array
        isOpen = new bool[count];

        // iterate through ports and test connection
        for (int i = 0; i < count; i++)
        {
            using (SerialPort serialPort = new SerialPort(portNames[i]))
            {

                serialPort.Open();
                // port is available 
                isOpen[i] = true;

            }
        }
    }

Ответы [ 3 ]

1 голос
/ 01 марта 2011

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

Например, допустим, у меня есть метод DownloadHtmlToString (string url). Обычно этот метод берет этот URL, выходит в Интернет, а затем сохраняет эту информацию в строку и возвращает ее.

Имея это во внешней библиотеке / классе / модуле / и т.д. Вы позволяете себе вызывать это синхронно, асинхронно и с несколькими потоками / задачами без необходимости редактировать эту основную функциональность. Ключ в том, чтобы сделать метод DownloadHtmlToString () поточно-ориентированным.

У меня есть привычка делать вещи потокобезопасными, даже если они изначально не предназначались для асинхронного вызова из-за будущего обслуживания. Кто знает, что в будущем у нас могут появиться 256-ядерные машины в ближайшие 5 лет, но мой код все еще должен работать в корпоративной среде и иметь возможность масштабирования с новым оборудованием.

1 голос
/ 01 марта 2011

Архитектурно, я бы создал поток из главной формы, который будет вызывать вашу библиотеку классов.Кто знает, может быть, какой-то другой класс, вызывающий вашу библиотеку, не нуждается в вызове в потоке.

В моем основном классе у меня есть что-то вроде:

this._checkSessionTimer = new Timer(intTimer * 2000);
this._checkSessionTimer.Elapsed += (o, e) => CheckSessions();

И CheckSessions отправляетсявызывайте все, что ему нужно.

Я также использую фоновые рабочие для выполнения своей работы, требующей длительных задержек с веб-сервером:

 BackgroundWorker linkWorker = new BackgroundWorker();
            linkWorker.DoWork += (o, e) =>
                             {
                             ...
                             };
            linkWorker.RunWorkerAsync();

Анонимная функция в моем рабочем DoWork фактически использует мой веб-сервисобертка для звонков через веб-сервис.

Однако, прежде чем делать подобные вещи, я ДЕЙСТВИТЕЛЬНО рекомендую прочитать:
http://www.albahari.com/threading/

0 голосов
/ 01 марта 2011

Создайте новый поток внутри вашего класса.

Создание потоков, как и других предметов, должно выполняться по объектно-ориентированным правилам.Encapsulation предписывает нам скрывать функциональность объекта внутри него.

I/O операции (например, network операции) являются хорошими примерами того, где нам нужны как блокирующие, так и неблокирующие методы..

Если этот класс будет использоваться только в приложениях win-form, пометьте его как STA и не допускайте его совместного использования несколькими потоками небезопасным способом.

...