1

私はこれについてSOからいくつかの異なる質問をすでに読みましたが、それでもそれを機能させることができませんでした。私はpublic static string[] files = Directory.GetFiles(CurrentDirectory, "*.wav", SearchOption.AllDirectories);、ファイルストリームに渡されるファイルパスの配列を取得するために使用しています。ファイルストリームが実行する操作は、1つのスレッドがすべてのファイルを処理するだけで時間がかかりすぎていました。そこで、配列を分割して、それらの小さい配列を別のスレッドに渡すことにしました。

そのために使用していたコードは、別のSOの質問から取得し、分割配列を渡すために使用しましたが、最初の配列の1つのファイルでしか機能しませんでしたが、問題が何であったかはわかっています。

var thing = from index in Enumerable.Range(0, files.Length) 
          group files[index] by index/600;
foreach(var set in thing)
    string.Join(";", set.ToArray());

(これは私が使用した方法とは異なり、覚えていないほど多くのことをいじっています。)これの問題は、すべてが1つの巨大なファイルパスとして扱われ、それぞれを取得するforeachループがあることです。小さい配列からのファイルですが、その中のすべてのファイルを1つとして扱い、検索から複数のファイルが返された場合にfilepathtoolong例外をスローしました。私の関数は配列を取り、それからforeach (string file in smallerArray)それぞれに書き込むために使用します。私がする必要があるのは、ファイル配列を4つの小さな配列に分割し、次のように新しいスレッドを開始することですnew Thread(() => { DoWork(newArray); }).Start();が、私が試したことは何も機能していません。

4

2 に答える 2

5

そこで、配列を分割し、それらの小さな配列を別のスレッドに渡すことにしました。

あなたはそれを難し​​い方法でやっているように聞こえます:)フレームワークに次のように処理させますParallel.ForEach:

Parallel.ForEach(files, file => 
{
    // Do stuff with one file
});
于 2012-08-01T18:33:41.647 に答える
0

ここに例があります

    public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> source, int blockSize)
    {
        if (source == null)
            throw new ArgumentNullException("source");
        if (blockSize <= 0)
            throw new ArgumentException("blockSize = {0}".FormatWith(blockSize), "blockSize");
        var result = new List<IEnumerable<T>>();
        for (int blockStartIndex = 0; blockStartIndex < source.Count(); blockStartIndex += blockSize)
        {
            int blockStart = blockStartIndex;
            int blockEnd = blockStartIndex + blockSize - 1;
            IEnumerable<T> block = source.Where((x, i) => i >= blockStart && i <= blockEnd);
            result.Add(block);
        }
        return result;
    }

ここにテストがあります

    [Test]
    public void TestSplit()
    {
        var list = new[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
        IEnumerable<IEnumerable<int>> splitted = list.Split(10);
        Assert.That(splitted.Count(), Is.EqualTo(1));
        Assert.That(splitted.First().Count(), Is.EqualTo(10));

        splitted = list.Split(11);
        Assert.That(splitted.Count(), Is.EqualTo(1));
        Assert.That(splitted.First().Count(), Is.EqualTo(10));

        splitted = list.Split(9);
        Assert.That(splitted.Count(), Is.EqualTo(2));
        Assert.That(splitted.First().Count(), Is.EqualTo(9));
        Assert.That(splitted.ElementAt(1).Count(), Is.EqualTo(1));

        splitted = list.Split(3);
        Assert.That(splitted.Count(), Is.EqualTo(4));
        Assert.That(splitted.First().Count(), Is.EqualTo(3));
        Assert.That(splitted.ElementAt(1).Count(), Is.EqualTo(3));
        Assert.That(splitted.ElementAt(2).Count(), Is.EqualTo(3));
        Assert.That(splitted.ElementAt(3).Count(), Is.EqualTo(1));
    }
于 2012-08-01T18:35:54.157 に答える