How to meets
Async and Task
2016.11.08 MVP SUMMIT SPECIAL: A NIGHT OF LIGHTNING TALKS
KOUJI MATSUI (@KEKYO2)
Kouji Matsui - kekyo
• NAGOYA city, AICHI pref., JP
• Twitter – @kekyo2 / Facebook
• ux-spiral corporation
• Microsoft Most Valuable Professional VS
and DevTech 2015-
• Certified Scrum master / Scrum product
owner
• Center CLR organizer.
• .NET/C#/F#/IL/metaprogramming or like…
• Bike rider
Agenda
Continuation Passing Style
.NET Task / async-await / F# Async workflow
Continuation Linking
Continuation Passing Style
Continuation-passing style (CPS) is a style of programming in which
control is passed explicitly in the form of a continuation.
“continuation-passing style” - Wikipedia
Continuation Passing Style
Continuation function
passing to argument
Continuation implement with
nested lambda expressions…
Standard direct style
Continuation Passing Style (Details)
Continuation-Passing style
Continuation implementation
nearly equals “Callback”
Continuation Passing Style (Details)
The callback technics likely async continuation handler in JavaScript.
Continuation-Passing style
Don’t worry!!
This technics naming “CPS!!”
Continuation Passing Style
Understand CPS?
Agenda
Continuation Passing Style
.NET Task / async-await / F# Async workflow
Continuation Linking
The keyword: .NET Task
The “Task” control interface in .NET 4.0.
In .NET 4.5 with C# 5.0, Task can handle in “async-await” style.
What relationship
between Task and CPS?
.NET Task (In .NET 4.0 / C# 4.0)
.NET 4.0 Task is using with ContinueWith function.
Continuation passing into Task.ContinueWith()
--> likely CPS
.NET Task (In .NET 4.5/C# 5.0)
And in .NET 4.5/C# 5.0 with “async-await” style:
That means
“Continuation” OK?
Using Task with async-await
.NET Task comparison
So, the continuation in async-await:
Means CPS for “async-await” syntax sugar.
In .NET 4.0 (C# 4.0 Task only) And .NET 4.5 (C# 5.0 async-await)
F# Async workflow
Async workflow supported from F# 2.0.
Integrated seamless async handling into F# syntax (In .NET 2.0)
What relationship
between Async and CPS?
F# Async workflow
Structure nearly equals “async-await.”
That’s CPS?
Returned Async<‘T> type
※ let! (Let-Bang) is awaiting for Async<‘T>, and bound ‘T value.
Means C#’s await keyword.
※ If continuation implement in F# Async workflow, use Async.FromContinuations<‘T>.
Overall Async implementations
.NET Task : using ContinueWith
.NET Task : using async-await
F# Async workflow : using let!
Both all patterns nearly with Continuation-Passing style?
Agenda
Continuation Passing Style
.NET Task / async-await / F# Async workflow
Continuation Linking
Connection both continuations
Can I connect by seamless between .NET Tasks and F# Asyncs?
◦ Before thinking, very nearly structure and interfaces for Task<T> and Async<‘T>.
Then?
◦ Can use await in C# for F#’s Async<‘T>?
◦ And/or can use let! in F# async workflow for Task<T>?
◦ If can, use let!, use!, do!, return! handling directly with HttpClient.GetStreamAsync().
Senario for .NET Task / C# side:
Declare augumented function “AsTask” on Async<‘T> class.
Can conversion from Async<‘T> to Task<T>.
◦ Use Async.StartWithContinuations<T> function:
Manipulate “TaskCompletionSource<T> class” (Handled SetResult,
SetException and SetCanceled functions) and returns Task<T>.
Implements Async<‘T>.GetAwaiter function (Augumented).
◦ Can directly awaitable for Async<‘T> in C#.
Senario for .NET Task / C# side:
Can directly awaitable for Async<int>.
C# compiler invoking GetAwaiter function.
Senario for F# Async workflow side:
Declare augumented function “AsAsync” on Task<T> class.
Can conversion from Task<T> to Async<‘T>.
◦ Use Async.FromContinuations<T> function:
Manipulate Async<‘T> functions from Task.ContinueWith function’s callbacks.
And declare augumented function “Source” on AsyncBuilder<‘T> class.
◦ Source function argument is “Task<T>” type and convet to Async<‘T>,
then can use directly let!, use!, do! and return! for Task<T> in F# Async workflow.
Senario for F# Async workflow side:
Can directly awaiting for Task<int>.
F# compiler translate calling “Source” function.
Other tips:
Conversion both System.Void and FSharp.Unit in type-safer:
◦ If awaiting for Async<unit> in C#, cannot receive result value (void).
◦ If using Task (Non-generic) in F# async workflow, can only do! expression.
Support the “CancellationToken”:
◦ .NET Task is explicitly handling CancellationToken (ex: argument received).
F# Async workflow is implicitly handling CancellationToken (Async.DefaultCancellationToken).
◦ --> Add CancellationToken argument for AsTask/AsAsync functions.
Don’t use Async.RunSynchronous function:
◦ If use RunSynchronous function, will be hard-blocked current thread nearly invoking Task.Wait.
Implements using for Async.FromContinuations<‘T> or Async.StartWithContinuations<‘T>.
Implement new type “AsyncCompletionSource<‘T>”:
◦ Async.FromContinuations<T> function handle diffecults (by callback structure) for internal impls.
I want to delegation-based interface likely “TaskCompletionSource<T>” class.
Thanks join!
The implementations --> GitHub: FusionTasks
◦ https://github.com/kekyo/FSharp.Control.FusionTasks
◦ https://www.nuget.org/packages/FSharp.Control.FusionTasks.FS40/
Progressing:
◦ FusionTasks (for .NET Core waiting for F# RTM :) Adjusting PCL profiles :(
◦ fscx (F# expandable compiler project) https://github.com/fscx-projects/
◦ RelaxVersioner (Git based very easy versioner)
https://github.com/kekyo/RelaxVersioner/
My blog (Sorry default language in Japanese)
◦ http://www.kekyo.net/

How to meets Async and Task

  • 1.
    How to meets Asyncand Task 2016.11.08 MVP SUMMIT SPECIAL: A NIGHT OF LIGHTNING TALKS KOUJI MATSUI (@KEKYO2)
  • 2.
    Kouji Matsui -kekyo • NAGOYA city, AICHI pref., JP • Twitter – @kekyo2 / Facebook • ux-spiral corporation • Microsoft Most Valuable Professional VS and DevTech 2015- • Certified Scrum master / Scrum product owner • Center CLR organizer. • .NET/C#/F#/IL/metaprogramming or like… • Bike rider
  • 3.
    Agenda Continuation Passing Style .NETTask / async-await / F# Async workflow Continuation Linking
  • 4.
    Continuation Passing Style Continuation-passingstyle (CPS) is a style of programming in which control is passed explicitly in the form of a continuation. “continuation-passing style” - Wikipedia
  • 5.
    Continuation Passing Style Continuationfunction passing to argument Continuation implement with nested lambda expressions… Standard direct style
  • 6.
    Continuation Passing Style(Details) Continuation-Passing style Continuation implementation nearly equals “Callback”
  • 7.
    Continuation Passing Style(Details) The callback technics likely async continuation handler in JavaScript. Continuation-Passing style Don’t worry!! This technics naming “CPS!!”
  • 8.
  • 9.
    Agenda Continuation Passing Style .NETTask / async-await / F# Async workflow Continuation Linking
  • 10.
    The keyword: .NETTask The “Task” control interface in .NET 4.0. In .NET 4.5 with C# 5.0, Task can handle in “async-await” style. What relationship between Task and CPS?
  • 11.
    .NET Task (In.NET 4.0 / C# 4.0) .NET 4.0 Task is using with ContinueWith function. Continuation passing into Task.ContinueWith() --> likely CPS
  • 12.
    .NET Task (In.NET 4.5/C# 5.0) And in .NET 4.5/C# 5.0 with “async-await” style: That means “Continuation” OK? Using Task with async-await
  • 13.
    .NET Task comparison So,the continuation in async-await: Means CPS for “async-await” syntax sugar. In .NET 4.0 (C# 4.0 Task only) And .NET 4.5 (C# 5.0 async-await)
  • 14.
    F# Async workflow Asyncworkflow supported from F# 2.0. Integrated seamless async handling into F# syntax (In .NET 2.0) What relationship between Async and CPS?
  • 15.
    F# Async workflow Structurenearly equals “async-await.” That’s CPS? Returned Async<‘T> type ※ let! (Let-Bang) is awaiting for Async<‘T>, and bound ‘T value. Means C#’s await keyword. ※ If continuation implement in F# Async workflow, use Async.FromContinuations<‘T>.
  • 16.
    Overall Async implementations .NETTask : using ContinueWith .NET Task : using async-await F# Async workflow : using let! Both all patterns nearly with Continuation-Passing style?
  • 17.
    Agenda Continuation Passing Style .NETTask / async-await / F# Async workflow Continuation Linking
  • 18.
    Connection both continuations CanI connect by seamless between .NET Tasks and F# Asyncs? ◦ Before thinking, very nearly structure and interfaces for Task<T> and Async<‘T>. Then? ◦ Can use await in C# for F#’s Async<‘T>? ◦ And/or can use let! in F# async workflow for Task<T>? ◦ If can, use let!, use!, do!, return! handling directly with HttpClient.GetStreamAsync().
  • 19.
    Senario for .NETTask / C# side: Declare augumented function “AsTask” on Async<‘T> class. Can conversion from Async<‘T> to Task<T>. ◦ Use Async.StartWithContinuations<T> function: Manipulate “TaskCompletionSource<T> class” (Handled SetResult, SetException and SetCanceled functions) and returns Task<T>. Implements Async<‘T>.GetAwaiter function (Augumented). ◦ Can directly awaitable for Async<‘T> in C#.
  • 20.
    Senario for .NETTask / C# side: Can directly awaitable for Async<int>. C# compiler invoking GetAwaiter function.
  • 21.
    Senario for F#Async workflow side: Declare augumented function “AsAsync” on Task<T> class. Can conversion from Task<T> to Async<‘T>. ◦ Use Async.FromContinuations<T> function: Manipulate Async<‘T> functions from Task.ContinueWith function’s callbacks. And declare augumented function “Source” on AsyncBuilder<‘T> class. ◦ Source function argument is “Task<T>” type and convet to Async<‘T>, then can use directly let!, use!, do! and return! for Task<T> in F# Async workflow.
  • 22.
    Senario for F#Async workflow side: Can directly awaiting for Task<int>. F# compiler translate calling “Source” function.
  • 23.
    Other tips: Conversion bothSystem.Void and FSharp.Unit in type-safer: ◦ If awaiting for Async<unit> in C#, cannot receive result value (void). ◦ If using Task (Non-generic) in F# async workflow, can only do! expression. Support the “CancellationToken”: ◦ .NET Task is explicitly handling CancellationToken (ex: argument received). F# Async workflow is implicitly handling CancellationToken (Async.DefaultCancellationToken). ◦ --> Add CancellationToken argument for AsTask/AsAsync functions. Don’t use Async.RunSynchronous function: ◦ If use RunSynchronous function, will be hard-blocked current thread nearly invoking Task.Wait. Implements using for Async.FromContinuations<‘T> or Async.StartWithContinuations<‘T>. Implement new type “AsyncCompletionSource<‘T>”: ◦ Async.FromContinuations<T> function handle diffecults (by callback structure) for internal impls. I want to delegation-based interface likely “TaskCompletionSource<T>” class.
  • 24.
    Thanks join! The implementations--> GitHub: FusionTasks ◦ https://github.com/kekyo/FSharp.Control.FusionTasks ◦ https://www.nuget.org/packages/FSharp.Control.FusionTasks.FS40/ Progressing: ◦ FusionTasks (for .NET Core waiting for F# RTM :) Adjusting PCL profiles :( ◦ fscx (F# expandable compiler project) https://github.com/fscx-projects/ ◦ RelaxVersioner (Git based very easy versioner) https://github.com/kekyo/RelaxVersioner/ My blog (Sorry default language in Japanese) ◦ http://www.kekyo.net/