lessons learned from developing a windows 8 metro application in c# frode nilsen nilsen labs ticki

52
Lessons learned fr om developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Tick i

Upload: gladys-johnson

Post on 16-Dec-2015

216 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Lessons learned from developing a Windows 8 Metro application in C#

Frode NilsenNilsen Labs

Ticki

Page 2: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Agenda

Async-await done right

Applying the MVVM pattern in Windows 8

Unscientific comparison of MS XAML technologies

Page 3: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki
Page 4: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

The async-await pattern

What it is

What it not is

Pitfalls

Applying it properly

Page 5: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Background

Feb 2012: Introduced in .Net 4.5 Spring 2011: Async CTP

June 2008: Task Parallel Library (TPL, .NET 4.0)

Page 6: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

The basics

Two new c# keywords: async and await

Makes asyncronous programming easy

Makes asyncronous code clean

Page 7: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

The old way

Page 8: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

The new way

Page 9: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

The new way

1

2

Page 10: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Defintion: Asynchrony

«Not at the same time»

When method returns to the caller

When the caller gets the return value

Threads

Page 11: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Going deeper

Async part 1, part 2 NDC 2012 presentation Lucian Wischik (Microsoft Senior Program Manager)

The Task Asynchronous Pattern (TAP) paperby Stephen Toub Feb 2012 (Microsoft Async Guru) Progress reporting

Cancellation

Retrying

Interleaving

Throttling

Page 12: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

The power of asynchronous programming - example

Page 13: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Option 1 – Serially

Rq 1 Rq 2 Rq 3

Time

Rq 4

Page 14: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Option 2 – In Parallel

Rq 1

Rq 2

Rq 3

Time

Rq 4

Page 15: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Request slot 2

Request slot 1

Option 3 – Throttled parallelism

Rq 1

Rq 2 Rq 3

Rq 4

Time

Google «AsyncSemaphore»

Page 16: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

DEMO – the powers of Tasks

Page 17: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Async pitfalls 1 : Blocking threads

• Task.Wait()• Task.Result

Page 18: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Async pitfalls 2 : Deadlocks

Page 19: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Async pitfalls 3 : Exceptions

Page 20: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Async pitfalls 4 : async void

Page 21: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Rule of thumbs for async await

Never return async void from a method, unless it’s a UI event handler

Always await async methods.If you want to run several tasks in parallel, use await Task.WhenAll() or await Task.WhenAny()

Never use Task.Wait() or Task.Result to «synchronify» async methods, except in unit tests.

Never do async calls from constructors

Page 22: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

MVVM in Windows 8

Recap of the gist

Applying it to Windows 8

Pitfalls

Tools and tips

Page 23: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

MVVM Model

View

ViewModel

Send notificationsData binding

and commands

Send notifications

Updates

From MSDN

Page 24: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

MVVM Model

View

ViewModel

Send notificationsData binding

and commands

Send notifications

UpdatesDATABINDING

Page 25: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Things that are impossible to do directly from the ViewModel

Give a visual element focus

Select text in a text box

Scroll an item into view

Show / hide Charms, App-or Navigation-bar

Page 26: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

MVVM

“MVVM is targeted at modern UI development platforms which support Event-driven programming”

Quotes from the Wikipedia article

Page 27: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

MVVM

“MVVM is targeted at modern UI development platforms which support Event-driven programming”

Quotes from the Wikipedia article

Page 28: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

DEMO - events

Page 29: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Controls and DataContext

A B C

A

ViewModels

Controls

B C D E

A ListView

Page 30: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Controls and DataContext

A B C

A

ViewModels

Controls

B C D E

A ListView

Page 31: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Controls and DataContext

A B C

A

ViewModels

Controls

B C D E

A ListView

D E

F

Page 32: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Controls and DataContext

AB C

A

ViewModels

Controls

B C D E

A ListView

D E

F

Page 33: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Solution: Pub/sub-pattern

Messenger

Publisher 1

Publisher 2

Publisher 2

Subscriber 1

Subscriber 2

Subscriber 2

Page 34: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Solution: Pub/sub-pattern

Messenger

Publisher 1

Publisher 2

Publisher 2

Subscriber 1

Subscriber 2

Subscriber 2

User controlsViewModels

Page 35: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Solution: Pub/sub-pattern

Messenger

Publisher 1

Publisher 2

Publisher 2

Subscriber 1

Subscriber 2

Subscriber 2MVVM Light Toolkit

link

Page 36: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

DEMO – pub/sub

Page 37: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

MVVM

“MVVM was designed to make use of data binding functions in WPF to better facilitate the separation of view layer development from the rest of the pattern by removing virtually all GUI code (“code-behind”) from the view layer”

Quotes from the Wikipedia article

Page 38: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Things that are impossible to do directly from the ViewModel

Give a visual element focus

Select text in a text box

Scroll an item into view

Show / hide Charms, App-or Navigation-bar

Page 39: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Things I thought were impossible, but were not

Trigger animations Achieved through the use of databound visual states and

attached properties

Alter the layout of a grid You can databind Grid.ColumnDefinition.Width

You can databind visibility of sections within the grid

Page 40: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Windows 8 XAML vs «other XAML»

Page 41: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Example 1: Bundled controls

Page 42: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Example 1: Bundled controls

WinForm SL Win8

Button X X X

DatePicker X X

DataGrid X X

TreeView X X

ComboBox X X

TabControl X X

Grid X X

StackPanel X X

MediaElement X X

Page 44: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Example 2: Databinding

Binding update on property changed

Page 45: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

WinForms

Page 46: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

WPF

Page 47: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Silverlight

• No UpdateSourceTrigger

Page 48: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

WinRT

• No UpdateSourceTrigger

• No BindingOperations.GetBinding()

Page 49: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

WinRT 2 (a slightly better alternative)

link

Page 50: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Microsoft XAML technologies

WPF

Silverlight

Windows Phone 7

Windows 8 (WinRT)

Time

Qu

ality

Page 51: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Thank you

Mail: [email protected]

Twitter: @nilzor

Blog: www.nilzorblog.com

Page 52: Lessons learned from developing a Windows 8 Metro application in C# Frode Nilsen Nilsen Labs Ticki

Q & A