【发布时间】:2019-11-05 04:38:11
【问题描述】:
假设我有一个包含日志文件的目录。 log file 我的程序必须创建 3 个带有一些统计信息的文本文件。 date statisticdomain statisticuser statistic
每个日志文件必须单独并行处理。但我不明白如何为具有许多参数的函数创建线程。 主要函数有void WriteInFileUserStat(string filename,string txt, Dictionary dict), void WriteInFileDomainStat(string filename, string txt, Dictionary dict), void WriteInFileDateStat(string filename, string txt, Dictionary dict)。
class Program
{
static void Main(string[] args)
{
string dirName = @"C:\MY DISK\Study\7th semester\Основы параллельной обработки данных\log";
string[] filelist = Directory.GetFiles(@"C:\MY DISK\Study\7th semester\Основы параллельной обработки данных\log", "*.txt");
string[] fileliststat = Directory.GetFiles(@"C:\MY DISK\Study\7th semester\Основы параллельной обработки данных\log\statistic", "*.txt");
string userlog = @"C:\MY DISK\Study\7th semester\Основы параллельной обработки данных\log\statistic\userlog.txt";
string domainlog = @"C:\MY DISK\Study\7th semester\Основы параллельной обработки данных\log\statistic\domainlog.txt";
string datelog = @"C:\MY DISK\Study\7th semester\Основы параллельной обработки данных\log\statistic\datelog.txt";
Dictionary<string, string> userDict = new Dictionary<string, string>();
Dictionary<string, string> domainDict = new Dictionary<string, string>();
Dictionary<string, string> dateDict = new Dictionary<string, string>();
//Thread userStatThread = new Thread(new ParameterizedThreadStart(WriteInFileUserStat));
//userStatThread.Start(s, userlog, userDict);
if (Directory.Exists(dirName))
{
Console.WriteLine("Файлы с логами прокси-сервера:");
string[] files = Directory.GetFiles(dirName);
foreach (string s in files)
{
string fname = s;
Console.WriteLine(s);
}
}
Console.WriteLine("Статистика по пользователям: ");
foreach(string s in filelist)
{
WriteInFileUserStat(s, userlog, userDict);
}
foreach (KeyValuePair<string, string> keyValue in userDict)
{
Console.WriteLine(keyValue.Key + " - " + keyValue.Value);
}
Console.WriteLine("Статистика по доменам: ");
foreach (string s in filelist)
{
WriteInFileDomainStat(s, domainlog, domainDict);
}
foreach (KeyValuePair<string, string> keyValue in domainDict)
{
Console.WriteLine(keyValue.Key + " - " + keyValue.Value);
}
Console.WriteLine("Статистика по датам: ");
foreach (string s in filelist)
{
WriteInFileDateStat(s, datelog, dateDict);
}
foreach (KeyValuePair<string, string> keyValue in dateDict)
{
Console.WriteLine(keyValue.Key + " - " + keyValue.Value);
}
Console.ReadLine();
}
/*Парсинг файла*/
public static void FilesParsing(string line)
{
string userName;
string domainName;
string traffic;
string date;
string[] filelist = Directory.GetFiles(@"C:\MY DISK\Study\7th semester\Основы параллельной обработки данных\log", "*.txt");
foreach (string file_to_read in filelist)
{
}
string[] parts = line.Split('\t');
userName = parts[0];
domainName = parts[1];
traffic = parts[2];
date = parts[3];
Console.WriteLine($"Username = {userName} , Domain name = {domainName}, Traffic = {traffic}, Date = {date}");
}
/*Чтение из файла*/
static public void ReadingFile(string filename)
{
using (StreamReader sr = new StreamReader(filename))
{
string line;
while ((line = sr.ReadLine()) != null)
{
FilesParsing(line);
}
}
}
/*Запись в файл статистики по пользователю*/
static public void WriteInFileUserStat(string filename,string txt, Dictionary<string, string> dict)
{
string user;
string traffic;
int trafficInt = 0;
int tempValue = 0;
using (StreamWriter swr = new StreamWriter(txt))
{
using (StreamReader sr = new StreamReader(filename))
{
string line;
while ((line = sr.ReadLine()) != null)
{
string[] parts = line.Split('\t');
user = parts[0];
traffic = parts[2];
if (dict.ContainsKey(user))
{
tempValue = Convert.ToInt32(dict[user]) + Convert.ToInt32(traffic);
dict.Remove(user);
trafficInt = Convert.ToInt32(traffic);
dict.Add(user, Convert.ToString(tempValue));
}
else dict.Add(user, traffic);
//swr.WriteLine("{0}\t{1}", user, traffic);
}
}
foreach (KeyValuePair<string, string> KeyValue in dict)
{
swr.WriteLine("{0} - {1}", KeyValue.Key, KeyValue.Value);
}
swr.Close();
}
}
/*Запись в файл статистики по доменам*/
static public void WriteInFileDomainStat(string filename, string txt, Dictionary<string, string> dict)
{
string domain;
string traffic;
int trafficInt = 0;
int tempValue = 0;
using (StreamWriter swr = new StreamWriter(txt))
{
using (StreamReader sr = new StreamReader(filename))
{
string line;
while ((line = sr.ReadLine()) != null)
{
string[] parts = line.Split('\t');
domain = parts[1];
traffic = parts[2];
if (dict.ContainsKey(domain))
{
tempValue = Convert.ToInt32(dict[domain]) + Convert.ToInt32(traffic);
dict.Remove(domain);
trafficInt = Convert.ToInt32(traffic);
dict.Add(domain, Convert.ToString(tempValue));
}
else dict.Add(domain, traffic);
//swr.WriteLine("{0}\t{1}", domain, traffic);
}
}
foreach (KeyValuePair<string, string> KeyValue in dict)
{
swr.WriteLine("{0} - {1}", KeyValue.Key, KeyValue.Value);
}
swr.Close();
}
}
/*Запись в файл статистики по дате*/
static public void WriteInFileDateStat(string filename, string txt, Dictionary<string, string> dict)
{
string date;
string traffic;
int trafficInt = 0;
int tempValue = 0;
using (StreamWriter swr = new StreamWriter(txt))
{
using (StreamReader sr = new StreamReader(filename))
{
string line;
while ((line = sr.ReadLine()) != null)
{
string[] parts = line.Split('\t');
date = parts[3];
traffic = parts[2];
if (dict.ContainsKey(date))
{
tempValue = Convert.ToInt32(dict[date]) + Convert.ToInt32(traffic);
dict.Remove(date);
trafficInt = Convert.ToInt32(traffic);
dict.Add(date, Convert.ToString(tempValue));
}
else dict.Add(date, traffic);
//swr.WriteLine("{0}\t{1}", date, traffic);
}
}
foreach (KeyValuePair<string, string> KeyValue in dict)
{
swr.WriteLine("{0} - {1}", KeyValue.Key, KeyValue.Value);
}
swr.Close();
}
}
}
【问题讨论】:
-
从一个动作中调用多参数函数。将 Action 用于线程 proc。
-
将许多参数作为对象传递。在方法中将对象转换为具有许多属性的具体类型。
-
你看过closures吗?
标签: c# multithreading