1 / 19

Asynchrony in (ASP).NET

Asynchrony in (ASP).NET. Aliaksandr Famin @ AlexSane. Developer and a Kettle. Developer and a Kettle. Wait Make someone to wait Check periodically Make someone to check Put a whistle on a kettle Add a web-interface to a kettle. Sync Sync with threads Async-sync

Télécharger la présentation

Asynchrony in (ASP).NET

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.


Presentation Transcript

  1. Asynchrony in (ASP).NET Aliaksandr @AlexSane

  2. Developer and a Kettle

  3. Developer and a Kettle • Wait • Make someone to wait • Check periodically • Make someone to check • Put a whistle on a kettle • Add a web-interface to a kettle • Sync • Sync with threads • Async-sync • Async with threads • Async with callbacks • Async with events

  4. Comparison

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

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

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

  8. Evolution: .NET 4.0 • Task Parallel Library

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

  10. Event-based async pattern X Y Z AsyncOperationManager SyncronizationContext All operations arecompleted Thread #1 XAsync YAsync PreRenderComplete PreRender ZAsync XCompleted Thread #2 Thread #3 YCompleted ZCompleted Thread #4

  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 staticvoid Main(string[] args) { varasyncResult = component.BeginSomeOperation( parameter, Callback, state); } void Callback(IAsyncResultaresult) { bool result = component.EndOperation(aresult); objectstate = asyncResult.AsyncState; }

  13. TTT#3: Unsubscribe from events staticvoid Main(string[] args) { component.OperationCompleted += component_OperationCompleted; component.OperationAsync("data", null); } staticvoidcomponent_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

More Related