ArgParser:
The F# PowerPack comes with a command-line parser that makes it easy to parse command-line options provided by a user.
The following links provide examples:
Example by Laurent Le Brun
Example by Robert Pickering
C# Port of Laurent Le Brun's Example by Steve Gilham
AsyncOperations:
Within the AsyncOperations.fsi file you'll find type extensions for StreamReader (AsyncReadToEnd) and File (AsyncOpenText, AsyncOpenRead, AsyncOpenWrite, AsyncAppendText, and AsyncOpen).
The following example is a modified version of one of the PowerPack unit tests, which shows AsyncOpenWrite and AsyncOpenRead in use.
open System.IO async { async { let buffer = "F# is fun!"B use! is = File.AsyncOpenWrite "test.txt" do! is.AsyncWrite(buffer, 0, buffer.Length) printfn "File written" } |> Async.RunSynchronously async { let buffer = Array.zeroCreate<byte>(7) use! is = File.AsyncOpenRead "test.txt" let! count = is.AsyncRead(buffer, 0, 7) printfn "File read" return count, buffer } |> Async.RunSynchronously |> ignore } |> Async.Start
AsyncStreamReader:
The AsyncStreamReader type provides a simple approach to reading streams asynchronously. Here's an example:
open System open System.IO open System.Text let text = [ new String([|for i in 1..1022 do yield 'x'|]) new String([|for i in 1..1022 do yield 'y'|]) new String([|for i in 1..1022 do yield 'z'|]) ].ToString() use stream = new MemoryStream() stream.Write(Encoding.UTF8.GetBytes(text), 0, text.Length) stream.Position <- 0L let reader = new AsyncStreamReader(stream, Encoding.UTF8) async { let rec readAllChars () = async { let! eof = reader.EndOfStream if not eof then let! character = reader.Read() do printf "%s" (character.ToString()) return! readAllChars () else printfn "%sRead complete" Environment.NewLine } do! readAllChars () } |> Async.StartAnother example of AsyncStreamReader can be found here (see the answer provided by Brian McNamara).
AsyncWorker:
The AsyncWorker type provides a great way to define and launch a background worker. Don Syme shows how to create and use a similar type in his Async and Parallel Design Patterns in F#: Reporting Progress with Events (plus Twitter Sample) post.
Here's an example of the AsyncWorker type from the PowerPack.
open Microsoft.FSharp.Control let rec job = async { for i in 1 .. 20 do printfn "doing some work" do! Async.Sleep 300 worker.ReportProgress i } and worker : AsyncWorker<_> = AsyncWorker(job) worker.ProgressChanged.Add(fun jobNumber -> printfn "job %d completed" jobNumber) worker.Error.Add(fun err -> printfn "Error: %A" err.Message) worker.Completed.Add(fun _ -> printfn "All jobs have completed") worker.Canceled.Add(fun _ -> printfn "Jobs have been canceled") worker.RunAsync() |> ignoreWrapping Up:
You can find working examples of each of these on my GitHub https://github.com/dmohl/FSharpPowerPackExample. Also, if you're interested in seeing more async examples, check out the series (C# Async Examples in F#) that Chris Marinos just started.
No comments:
Post a Comment