我有应用程序Take Pcap file
并通过机器网卡发送所有数据包。
因为我正在使用的DLL(PcapDotNet)仅在用户选择Pcap files
时才处理Wireshark file
我正在使用Wireshark
Capinfos
进程(在这种情况下为Command line
)并且在将此文件添加到我的ListView
之前接收文件格式,因此如果我有很多文件,这需要一些时间取决于文件大小。
因此,在用户选择要添加的Wireshark
文件之后,我将执行此功能中的所有工作:
private IEnumerable<string> _source;
public void Search()
{
Task.Factory.StartNew(() =>
{
try
{
Parallel.ForEach(_source,
new ParallelOptions
{
MaxDegreeOfParallelism = 2 //limit number of parallel threads here
},
file =>
{
// Here i am open Capinfos process and checking every file before add to my ListView
});
}
catch (Exception)
{ }
}).ContinueWith
(t =>
{
// Finish to check/add all files
}
, TaskScheduler.FromCurrentSynchronizationContext() //to ContinueWith (update UI) from UI thread
);
}
正如您在此操作中所看到的,我呼叫Search()
收集用户选择的所有文件并同时打开2 Capinfos
进程。
现在我有新的问题阻止我使用这个功能,虽然我的目的是相似的 - 添加文件到我的应用程序。
我的网络上有根文件夹,这个文件夹有很多sub-folders
(大约200 - 300),在每个文件夹中我想要X
最新文件(用户定义),所以我使用这个函数:< / p>
public static List<string> List;
private static void ExcuteAqury(string directory)
{
if (Directory.Exists(directory))
{
SearchOption searchOption = SearchOption.TopDirectoryOnly;
var files =
Directory.EnumerateFiles(directory, "*.pcap", searchOption);
List.AddRange(files);
}
}
在这种情况下,用户通过GridView
Check Box
选择想要的文件夹,并且此功能一次又一次地通过循环调用,每次都将结果添加到List
并在完成此工作后我用我的列表(列表)呼叫Search()
。
我的问题是,有时多次调用ExcuteAqury函数需要时间,所以我想也许尝试不同的方法:
每次ExcuteAqury function
拨打电话后,我想将其结果并将其放入Queue
,并在我的Queue
不为空时立即开始检查这些文件,当然我想再次将并发Threads
限制为2以避免我的机器变慢。
所以我想知道如何实现这一点,并很乐意提供一些帮助/指导