One difference I noticed today is the sleep feature. If you do Thread.Sleep(xxx) in C#'s async function, it actually turns it into a synchronous call. But for F#, the function call is still an async function call. The following code is a sample. In the C# version, if you use the Thread.Sleep(5000), there will be a warning indicate the function call is actually a sync call. I would have to say C# feature is not perfect, because C# use static checking to decide if it is async or sync and totally delay the check to runtime.
F# version:
let slowComputation = async {
System.Threading.Thread.Sleep(5000);
return "aa"
}
let f() = async {
let! v = slowComputation
printfn "result = %s" v
}
f()
|> Async.Start
printfn "about to wait..."
System.Threading.Thread.Sleep(15000);
printfn "Done"
C# version:
class Program
{
public async Task<string> SlowComputaton()
{
await Task.Delay(5000);
//Thread.Sleep(5000);
return "aaa";
}
public async void F()
{
var x = await SlowComputaton();
Console.WriteLine(x);
}
static void Main(string[] args)
{
var p = new Program();
p.F();
Console.WriteLine("about to wait...");
Thread.Sleep(15 * 1000);
Console.WriteLine("Done");
}
}
No comments:
Post a Comment