Is there an async version of DirectoryInfo.GetFiles / Directory.GetDirectories in dotNet?

前端 未结 7 2129
北荒
北荒 2020-12-08 06:50

Is there an asynchronous version of DirectoryInfo.GetFiles / Directory.GetDirectories in dotNet? I\'d like to use them in an F# async block, and it\'d be nice to have a ver

7条回答
  •  南方客
    南方客 (楼主)
    2020-12-08 07:01

    I didn't find an async version of GetFiles, however if you look at the sourcecode for other Async operations, they're defined as follows:

    module FileExtensions =
    
            let UnblockViaNewThread f =
                async { //let ctxt = System.Threading.SynchronizationContext.Current
                        do! Async.SwitchToNewThread ()
                        let res = f()
                        do! Async.SwitchToThreadPool ()
                        //do! Async.SwitchTo ctxt
                        return res }
    
            type System.IO.File with
                static member AsyncOpenText(path)   = UnblockViaNewThread (fun () -> System.IO.File.OpenText(path))
                static member AsyncAppendText(path) = UnblockViaNewThread (fun () -> System.IO.File.AppendText(path))
                static member AsyncOpenRead(path)   = UnblockViaNewThread (fun () -> System.IO.File.OpenRead(path))
                static member AsyncOpenWrite(path)  = UnblockViaNewThread (fun () -> System.IO.File.OpenWrite(path))
                static member AsyncOpen(path,mode,?access,?share) =
                    let access = match access with Some v -> v | None -> System.IO.FileAccess.ReadWrite
                    let share = match share with Some v -> v | None -> System.IO.FileShare.None
                    UnblockViaNewThread (fun () -> System.IO.File.Open(path,mode,access,share))
    
                static member OpenTextAsync(path)   = System.IO.File.AsyncOpenText(path)
                static member AppendTextAsync(path) = System.IO.File.AsyncAppendText(path)
                static member OpenReadAsync(path)   = System.IO.File.AsyncOpenRead(path)
                static member OpenWriteAsync(path)  = System.IO.File.AsyncOpenWrite(path)
                static member OpenAsync(path,mode,?access,?share) = System.IO.File.AsyncOpen(path, mode, ?access=access, ?share=share)
    

    In other words, the Async file, streamreader, and WebClient operations are just wrappers around the syncronous operations, so you should be able to write your own wrapper around GetFiles/GetDirectories as follows:

    module IOExtensions =
        type System.IO.Directory with
            static member AsyncGetFiles(directory) = async { return System.IO.Directory.GetFiles(directory) }
            static member AsyncGetDirectories(path) = async { return System.IO.Directory.GetDirectories(path) }
    

提交回复
热议问题