我有这种情况,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);
}
我必须将方法设为静态吗?使用的变量怎么样?
答案 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,据我所知,它是处理器的数量。但它会再次同步所有工作线程。所以这取决于你想要实现的目标,