F#:
open System open System.IO open System.Net let getHtml url printStrategy = async { let request = WebRequest.Create(Uri url) use! response = request.AsyncGetResponse() use stream = response.GetResponseStream() use reader = new StreamReader(stream) let contents = reader.ReadToEnd() do printStrategy url contents return contents } let sites = ["http://www.bing.com"; "http://www.google.com"; "http://www.yahoo.com"; "http://msdn.microsoft.com/en-us/fsharp/default.aspx"] let printStrategy url (contents:string) = printfn "%s - HTML Length %d" url contents.Length let sitesHtml = Async.Parallel [for site in sites -> getHtml site printStrategy] |> Async.RunSynchronously do printfn "\r\nProcess Complete\r\nPress any key to continue" do Console.ReadLine() |> ignore
C#:
using System; using System.IO; using System.Net; using System.Threading.Tasks; using System.Linq; namespace CSharpAsync { class Program { static async Task<string> GetHtml(string url, Action<string, string> printStrategy) { var request = WebRequest.Create(new Uri(url)); using (var response = await request.GetResponseAsync()) { using (var stream = response.GetResponseStream()) { using (var reader = new StreamReader(stream)) { var contents = reader.ReadToEnd(); printStrategy.Invoke(url, contents); return contents; } } } } static async Task ProcessSites(string[] sites, Action<string, string> printStrategy) { var sitesHtml = await TaskEx.WhenAll( sites.Select(site => GetHtml(site, printStrategy))); Console.WriteLine("\r\nProcess Complete\r\nPress any key to continue"); } static void Main(string[] args) { var sites = new[] { "http://www.bing.com", "http://www.google.com", "http://www.yahoo.com", "http://msdn.microsoft.com/en-us/fsharp/default.aspx" }; Action<string, string> printStrategy = (url, contents) => Console.WriteLine("{0} - HTML Length {1}", url, contents.Length); ProcessSites(sites, printStrategy).Wait(); Console.ReadLine(); } } }
VB:
Imports System Imports System.IO Imports System.Net Imports System.Threading.Tasks Imports System.Linq Module Module1 Async Function GetHtml(ByVal url As String, ByVal printStrategy As Action(Of String, String)) As Task(Of String) Dim request = WebRequest.Create(New Uri(url)) Using response = Await request.GetResponseAsync() Using stream = response.GetResponseStream() Using reader = New StreamReader(stream) Dim contents = reader.ReadToEnd() printStrategy.Invoke(url, contents) Return contents End Using End Using End Using End Function Async Function ProcessSites(ByVal sites As String(), ByVal printStrategy As Action(Of String, String)) As Task Dim sitesHtml = _ Await TaskEx.WhenAll(sites.Select(Function(site) GetHtml(site, printStrategy))) Console.WriteLine("{0}Process Complete{0}Press any key to continue", _ Environment.NewLine) End Function Sub Main() Dim sites = New String() {"http://www.bing.com", _ "http://www.google.com", _ "http://www.yahoo.com", _ "http://msdn.microsoft.com/en-us/fsharp/default.aspx"} Dim printStrategy As Action(Of String, String) = _ Sub(url, contents) Console.WriteLine("{0} - HTML Length {1}", url, contents.Length) ProcessSites(sites, printStrategy).Wait() Console.ReadLine() End Sub End Module