实现多读者/多作者队列

时间:2014-08-28 08:18:24

标签: c# .net multithreading queue

我有应用程序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以避免我的机器变慢。 所以我想知道如何实现这一点,并很乐意提供一些帮助/指导

0 个答案:

没有答案