53

dotNet に DirectoryInfo.GetFiles / Directory.GetDirectories の非同期バージョンはありますか? F# の async ブロックでそれらを使用したいのですが、AsyncCallbacks で呼び出せるバージョンがあると便利です。

問題は、おそらく低速のネットワーク接続を介した SMB マウントで、一連のディレクトリを吸い込もうとしていることです。他の作業を行っている可能性があるときに、ネットワークの読み取りを待機しているスレッド プール スレッドの束を望んでいません。

4

7 に答える 7

13

いいえ、ないと思います。プール スレッドのアプローチは、おそらく最も実用的です。または、P/Invoke にドロップダウンすることもできると思いますが、それはより多くの作業になります。

于 2009-04-05T14:52:28.620 に答える
5

実際には、 のヘルプDirectory.GetFilesによると、リスト全体を待ってから戻るのではなく、Directory.EnumerateFilesすぐに最初の結果を返します (これはです)。IEnumerableそれがおそらくあなたが探しているものだと思います。

于 2014-01-26T14:25:30.617 に答える
3

私はこのアプローチを数回使用して、関数/プロシージャから非同期オブジェクトを取得しましたが、常にうまく機能しました。


let AsyncGetDirectories path = 
    let fn = new Func<_, _>(System.IO.Directory.GetDirectories)
    Async.BuildPrimitive(path, fn.BeginInvoke, fn.EndInvoke)
于 2009-04-05T18:49:10.937 に答える
-1

私はF#プログラマーではありませんが、C#でこれを行います。

static IEnumerable<string> IterateFiles(string path, string pattern) {
    var entryQueue = new Queue<string>();
    entryQueue.Enqueue(path);

    while (entryQueue.Count > 0) {
        var subdirs = Directory.GetDirectories(entryQueue.Peek());
        var files = Directory.GetFiles(entryQueue.Peek(), pattern, SearchOption.TopDirectoryOnly);
        foreach (var file in files)
            yield return file;
        entryQueue.Dequeue();

        foreach(var subdir in subdirs)
            entryQueue.Enqueue(subdir);
    }
}

F#のイテレータと同様の構造があると思います。

于 2013-01-01T21:24:33.180 に答える