关于如何在c#中实现线程的问题

时间:2011-08-27 04:42:36

标签: c# .net multithreading thread-safety

我有这种情况,Windows服务在服务器上运行。它每隔一小时左右读取一个日志文件并将内容保存到db。 现在,将有三个文件,这些文件必须被读取并保存到三个不同的表中。 (我将从配置文件中读取这些连接字符串等)这可以通过我知道的线程来实现。所以我想在一个线程中调用现有的'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 个答案:

答案 0 :(得分:2)

在.NET 4中,您可以利用任务并行库,因此您不必显式创建线程,而只需表达您要执行的代码并行:

Parallel.ForEach(configs.Select( x => x.Key.ToString()), path => ExecuteProcess(path));

答案 1 :(得分:0)

我个人的偏好是将ThreadPool用于我希望在火灾和遗忘场景中并行运行的线程,例如

之类的东西
foreach (DictionaryEntry keyvalue in configs)
{
    ThreadPool.QueueUserWorkItem((state) =>
    {
        ExecuteProcess(keyvalue.Key.ToString());
    });
}

Parallel Task库也很有用,但不能保证并行,而是adapts,据我所知,它是处理器的数量。但它会再次同步所有工作线程。所以这取决于你想要实现的目标,