Вопрос о том, как добиться потоков в C # для этого сценария - PullRequest
0 голосов
/ 27 августа 2011

У меня есть такой сценарий, когда служба Windows работает на сервере.Каждый час или около того он читает файл журнала и сохраняет содержимое в БД.Теперь будет три файла, и они должны быть прочитаны и сохранены в трех разных таблицах.(Я прочитаю эти строки подключения и т. д. из файла конфигурации). Это может быть достигнуто за счет многопоточности, которую я знаю.Поэтому я хочу вызвать существующий метод readfile в потоке.

Я не знаком с потоками, но так ли это?

NameValueConfigurationCollection config = ConfigurationManager.GetSection("LogDirectoryPath") as NameValueConfigurationCollection;  

            foreach (DictionaryEntry keyvalue in configs)
            {
               Thread t = new Thread(new ThreadStart(ExecuteProcess(keyvalue.Key.ToString())));
                t.IsBackground = true;
                t.Start();

            }


private void ExecuteProcess(string path)
      {
        var xPathDocument = new XPathDocument(path);
          XPathNavigator xPathNavigator = xPathDocument.CreateNavigator();

        string connectionString = GetXPathQuery(
            xPathNavigator,
            "/connectionString/@value");

        string commandText = GetXPathQuery(
            xPathNavigator,
            "/commandText/@value");

        string filePath = GetXPathQuery(
            xPathNavigator,
            "/filePath/@value");

        SqlConnection sqlConnection = new SqlConnection(connectionString);
        sqlConnection.Open();

        ProcessFiles(sqlConnection, commandText, filePath);
}

Нужно ли делатьметод статический?Как насчет используемых переменных?

Ответы [ 2 ]

2 голосов
/ 27 августа 2011

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

Parallel.ForEach(configs.Select( x => x.Key.ToString()), path => ExecuteProcess(path));
0 голосов
/ 27 августа 2011

Мое личное предпочтение - использовать ThreadPool для потоков, которые я хочу запустить параллельно в сценарии пожара и забыть, например, что-то вроде

foreach (DictionaryEntry keyvalue in configs)
{
    ThreadPool.QueueUserWorkItem((state) =>
    {
        ExecuteProcess(keyvalue.Key.ToString());
    });
}

Параллельное задание Библиотека 1007 * также полезна, но не гарантирует параллельности, и вместо нее адаптирует , насколько я понимаю, к числу процессоров.Однако он снова синхронизирует все ваши рабочие потоки.Так что это зависит от того, чего вы пытаетесь достичь,

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