Presentation is loading. Please wait.

Presentation is loading. Please wait.

Asynchrony in (ASP).NET Aliaksandr

Similar presentations


Presentation on theme: "Asynchrony in (ASP).NET Aliaksandr"— Presentation transcript:

1 Asynchrony in (ASP).NET Aliaksandr Famin ShurickFomin@gmail.com @AlexSane

2 Developer and a Kettle

3 1.Wait 2.Make someone to wait 3.Check periodically 4.Make someone to check 5.Put a whistle on a kettle 6.Add a web-interface to a kettle 1.Sync 2.Sync with threads 3.Async-sync 4.Async with threads 5.Async with callbacks 6.Async with events

4 Comparison Approach Transferring 1K, rps Transferring 1M, rps Sync2844,44100%32,5726% Async with callbacks 2547,2690%125,97100% Async-sync2327,2882%33,0426% Sync with threads861,2330%83,8967% Async with threads604,8421%80,3664%

5 Evolution: WinAPI struct OVERLAPPED (IAsyncResult) OVERLAPPED_COMPLETION_ROUTINE (AsyncCallback)

6 6 Evolution:.NET 1.0 – 1.1 IAsyncResult AsyncCallback BeginXXX(@params, callback, userState) EndXXX(asyncResult)

7 7 Evolution:.NET 2.0 – … event XXXCompleted XXXCompletedEventArgs EventHandler XXXAsync(@params, userState) CancelAsync() AsyncOperationManager AsyncOperation SyncronizationContext

8 Evolution:.NET 4.0 Task Parallel Library

9 IAsyncResult vs Events IAsyncResult 1.Callbacks are not thread safe 2.No context in callbacks (i.e. no HttpContext) 3.Complexity of chaining (custom IAsyncResult, etc.) 4.Poor support of components Events 1.Event handlers are under lock 2.HttpContext available 3.Chaining is simple 4.Component-oriented ContextAwareResult, but no guarantee

10 SyncronizationContext Event-based async pattern Thread #1 XAsyncYAsync Thread #3YCompleted Thread #2 ZAsync Thread #4 ZCompleted PreRenderComplete PreRender AsyncOperationManager XY XCompleted Z All operations are completed

11 TTT #1: Use closures var asyncResult = component.BeginSomeOperation(parameter, aresult => TrickyCallback(aresult, component), state); void TrickyCallback(IAsyncResult state, Component component) { bool result = component.EndOperation(state); }

12 TTT#2: Use userState carefully static void Main(string[] args) { var asyncResult = component.BeginSomeOperation( parameter, Callback, state); } void Callback(IAsyncResult aresult) { bool result = component.EndOperation(aresult); object state = asyncResult.AsyncState; }

13 TTT#3: Unsubscribe from events static void Main(string[] args) { component.OperationCompleted += component_OperationCompleted; component.OperationAsync("data", null); } static void component_OperationCompleted(object sender, EventArgs e) { component.OperationCompleted -= component_OperationCompleted; }

14 TTT#5: There is no timeout support in both async patterns

15 TTT#6 AsyncResult callbacks don’t have HttpContext It could be, but there is no guarantee

16 TTT#7 Do not convert event-based pattern to IAsyncResult one Event-based pattern uses locks, that could be not desirable

17 TTT #8: Do not use [ThreadStatic] Do not forget about ThreadPool

18 TTT#9: Do not throw exceptions in callbacks Even WSE 3.0 has had a bug we had spotted.

19 Q&A


Download ppt "Asynchrony in (ASP).NET Aliaksandr"

Similar presentations


Ads by Google