.NET 4.5 og C# 5.0. Denne artikel beskriver nogle af de nye features i.net 4.5 og C# 5.0. Den forudsætter et vist kendskab til.net og C#.

Relaterede dokumenter
.NET 4.0 og C# 4.0. Denne artikel beskriver nogle af de nye features i.net 4.0 og C# 4.0. Den forudsætter et vist kendskab til.net og C#.

Parameters. Denne artikel beskriver hvorfor parameters er gode. Den forudsætter lidt kendskab til C# og ADO.NET.

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java

Introduction til.net remoting i C#

Singleton pattern i C#

Undtagelseshåndtering i C#

Introduction til.net remoting i VB.NET

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

1B fil database. //globale variabler DateTime tid; // erklærer en variabel af typen datetime DateTime dag; // erklærer en variabel af typen datetime

Skrevet den 18. Feb 2010 af arne_v I kategorien Programmering / Visual Basic.NET

Den forudsætter kendskab til XML og C# men ikke til brug af XML i C#.

Send fra Java. Denne artikel fortæller hvad man skal bruge og hvordan man skal kode for at sende fra Java.

Tredjepart webservices

Anvendelse af metoder - Programmering

Singleton pattern i Java

Geografisk lokalisering i ASP.NET

.NET 3.5 og C# 3.0. Denne artikel viser hvordan man kan bruge nogle af de nye features i.net 3.5 og C# 3.0. Det er ikke en komplet oversigt.

Endnu mere om tilfældige tal

Hvorfor skal vi bruge objekt orienteret databaser?

I denne artikel vil vi bruge en User klasse som vi så vil gruppere på forskellige måder.

Introduktion til NAnt

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

RMI avanceret. Denne artikel beskriver nogle mere avancerede features i RMI. Den gør det muligt at lave mere realistiske applikationer.

Den forudsætter kendskab til XML og VB.NET men ikke til brug af XML i VB.NET.

Hvilket sprog er hurtigst

MapBasic &.NET interaktion. MapBasic.NET. Jakob Lanstorp IT konsulent COWI. Odense 23. Juni jun 2011 MapBasic &.

Den forudsætter kendskab til C++ og lidt kendskab til SQL og MySQL C API.

Modern Concurrency Abstractions for C#

A Profile for Safety Critical Java

Abstrakte datatyper C#-version

Denne artikel gennemgår kort nogle mulighederne for brug af XML i ASP. Det sker ved brug af eksempler. Eksemplerne vil være i VBS.

MySQL C API. Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere.

Common Language Runtime. Multithreading

Database for udviklere. Jan Lund Madsen PBS10107

Bemærk, der er tale om ældre versioner af softwaren, men fremgangsmåden er uændret.

Test med JUnit 3. Denne artikel introducerer JUnit 3. Den forklarer ideen med JUnit. Og den viser hvordan man konkret bruger det.

Integrationsmanual. Anvendelse af webservice til kursusoversigt i Campus. Brugervejledning til udviklere

Prepared Statements. Denne artikel beskriver hvorfor prepared statements er gode. Den forudsætter lidt kendskab til Java og JDBC.

Civilstyrelsen. Lex Dania editor. Installationsvejledning. Version:

Test med NUnit. Denne artikel introducerer NUnit. Den forklarer ideen med NUnit. Og den viser hvordan man konkret bruger det.

Tilfældige tal. Denne artikel introducerer generering af tilfældige tal og viser lidt om hvad man kan og ikke mindst hvad man ikke bør bruge.

CodeDOM - Dynamisk generering og kompilering af kode

Installation og Drift. Aplanner for Windows Systemer Version 8.15

applikation----x----odbc driver manager----foobar ODBC driver----foobar database

AktivLog. Log program for EDR s 80m aktivitetstest. Af oz1gdi / 5p0o Steen Rudberg. AktivLog V af 11

Introduktion til funktioner, moduler og scopes i Python

Kursusarbejde 3 Grundlæggende Programmering

Installation og Drift. Aplanner for Windows Systemer Version

MANUAL SKIOLD GØR EN FORSKEL DM6000 INSTALLATION

Udvikling af DOTNET applikationer til MicroStation i C#

Plugin-arkitektur med.net

Arduino Programmering

Arkitektur for begyndere

Studiepraktik. Thomas Bøgholm Mikkel Hansen Jacob Elefsen

Hvad er Objekter - Programmering

FairSSL Fair priser fair support

Forskellige Java versioner

DANMARKS TEKNISKE UNIVERSITET

Opsætning af udviklerversion af Microsofts open source XDS.b fra Codeplex Projekt: Net4Care Version: V0.1,

Indledning. Hvorfor det forholder sig sådan har jeg en masse idéer om, men det bliver for meget at komme ind på her. God fornøjelse med læsningen.

Tech College Aalborg. ASP.NET Hjemmeside. Projekt Smart Zenior Home - Guide til ASP.NET hjemmeside med Visual Studio

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

Specifikation Abstrakt OO OS-API Rev Specifikation. Abstrakt, objektorienteret operativsystem-api

Nye Java XML API'er

Projekt: VAX Integrator

Introduktion til AOP i C#

Fra Excel til Capture part

Logging i Java. Den forudsætter kendskab til Java og noget generel udviklings erfaring. Denne guide er oprindeligt udgivet på Eksperten.

Fra idé til virkelig med Azure Mobile Services

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

FairSSL Fair priser fair support

NN Markedsdata. Til. Microsoft Dynamics CRM 2011 Installations guide

Citrix CSP og Certificate Store Provider

DM507 Algoritmer og datastrukturer

Microcontroller, Arduino

At klippe en streng over på det mest hensigtsmæssige sted

Lektion 6. Grundlæggende programmering i VR

Opsætning af MobilePBX med Kalenderdatabase

MANUAL SKIOLD GØR EN FORSKEL DISTRIWIN SERVICE INSTALLATION

Program Dokumentation PC Software Skrevet af. Gruppen. Version 1.0

DM507 Algoritmer og datastrukturer

HELLO INSTALLATIONS GUIDE - DANSK RACKPEOPLE

WINDOWS FORMS EVENTS INTERAGEREN MED FIL SYSTEMET. Grundlæggende programmering Lektion 9

KOM GODT I GANG MED. Desktop Mendeley Menuen er simpel og intuitiv. I Menuen Tools finder du web importer og MS Word plugin

Register-databasen med.net

10. Rapporter i BBR... 2

Ivan Overgaard 11/29/2012

Velkommen på kursus hos Microworld

Bits, bit operationer, integers og floating point

Dan Rolsted PIT. Side 1

DM507 Algoritmer og datastrukturer

METODER ARV KLASSER. Grundlæggende programmering Lektion 5

DM507 Algoritmer og datastrukturer

Kvik start opsætning af kamera det første du skal gøre:

Projekt: VAX NemHandel 4.0

Debugging ivs. Praksis eksempel. Assemblies Attributes Dynamic programming. Github. Multithreading. Grundlæggende programmering Lektion 6

Moderne SAS-programmering på webben med SAS Studio. Georg Morsing SAS Institute

I denne artikel vil du ved hjælp af arrays kunne afrunde et decimaltal til et helt tal.

Write-N-Cite III til Word 2003

Affaldsdatasystem Vejledning supplement i system-til-system integration for.net brugere

Transkript:

Denne guide er oprindeligt udgivet på Eksperten.dk.NET 4.5 og C# 5.0 Denne artikel beskriver nogle af de nye features i.net 4.5 og C# 5.0. Den forudsætter et vist kendskab til.net og C#. Skrevet den 11. okt 2012 af arne_v I kategorien Programmering / C# Historie: V1.0-26/08/2012 - original V1.1 - fix typo i versions numre Versions numre Nu er der igen kaos i versions numrene. C# går fra 4.0 til 5.0.NET library går fra 4.0 til 4.5.NET runtime forbliver på 4.0 Hvornår.NET 4.5 (og Visual Studio 2012) blev releaset 15. augusr 2012. Generelt Den her opdatering er anderledes end de tidligere opdateringer. På nogen måder er det den største opdatering nogensinde i.net og C#. På andre måder er det ikke så store ændringer. Kompabilitet Først en lille note. Et system med kun.net 4.0 runtime (Windows 8 eller 2012) vil som default ikke køre.net 2.0 (og 3.5) programmer. Enten skal der installeres 3.5 (hvilket vil blive foreslået) eller der skal tilføjes noget i app.config: <configuration> <startup> <supportedruntime version="v2.0.50727" /> <supportedruntime version="v4.0" /> </startup>

</configuration> eller <configuration> <startup uselegacyv2runtimeactivationpolicy="true"> <supportedruntime version="v4.0" /> </startup> </configuration> Det sidste skulle være godt for noget COM og/eller mixed mode C++ - jeg har ikke sat mig ind i detaljerne. Store objekter Hidtil har der været en max. størrelse for objekter på 2 GB. Det kan nu ændres via konfiguration med.net 4.5 for 64 bit Windows. app.config: <configuration> <runtime> <gcallowverylargeobjects enabled="true" /> </runtime> <startup> <supportedruntime version="v4.0" sku=".netframework,version=v4.5" /> </startup> </configuration> Bemærk at: - 2^31-1 er stadig limit for antal elementer i array - max. længde af string er uændret async & await Langt den største ændring i C# 5.0 er introduktionen af async og await. Og selvom ideen i asynkrone kald er simpel, så er disse to keywords lidt tricky at forstå. Og det bliver ikke bedre af at de valgte keywords er ret misvisende: async i sig selv gør ikke en metode asynkron - den gør bare at man kan bruge await

await venter ikke - tværtimod gør den noget asynkron Så for at udføre noget asynkront i en metode er proceduren: 1) put async på metoden for at kunne bruge await 2) put await på den linie som man vil udføre asynkront fra C# compileren vil så generere kode hvor den awaitede linie og de efterfølgende linier udføres i en anden tråd mens metoden returnerer til kalder med det samme. Lad os illustrere med nogle eksempeler. Først en helt normal synkron version: namespace Asy1 public static void Test() Thread.Sleep(1000); Console.WriteLine("Thread 0 done at 1", Thread.CurrentThread.ManagedThreadId, Console.WriteLine("Calls completed at 0", Console.WriteLine("Main done at 0", Output ser som forventet ud som: Thread 1 done at 11:31:36.757 Thread 1 done at 11:31:37.769 Thread 1 done at 11:31:38.769 Calls completed at 11:31:38.769 Main done at 11:31:41.869

Lad os så prøve med async og await: namespace Asy2 public async static Task Test() await Task.Delay(1000); Console.WriteLine("Thread 0 done at 1", Thread.CurrentThread.ManagedThreadId, Console.WriteLine("Calls completed at 0", Console.WriteLine("Main done at 0", Output ser nu ud som: Calls completed at 11:37:03.154 Thread 4 done at 11:37:04.157 Thread 6 done at 11:37:04.178 Thread 5 done at 11:37:04.178 Main done at 11:37:06.265 Hvor vi ser at: - alle 3 Test kald er returneret inden de faktisk udføres - de udføres i forskellige tråde Vi noterer også at: * metoden skal returnere Task fremfor void * der bruges Task.delay fremfor Thread.Sleep da sidstnævnte ikke understøtter await Men nogen gange er det jo nødvendigt at vente på noget asynkront er færdigt. Det kan gøres via det returnerede Task objekt:

namespace Asy3 public async static Task Test() await Task.Delay(1000); Console.WriteLine("Thread 0 done at 1", Thread.CurrentThread.ManagedThreadId, Task t1 = t1.wait(); Task t2 = t2.wait(); Task t3 = t3.wait(); Console.WriteLine("Calls completed at 0", Console.WriteLine("Main done at 0", Nu ser output ud som: Thread 4 done at 11:42:08.110 Thread 4 done at 11:42:09.123 Thread 4 done at 11:42:10.137 Calls completed at 11:42:10.137 Main done at 11:42:13.237 Men bemærk at man kan sagtens udføre en masse kode mellem await og Wait kaldet. Wait er vigtigt når man skal have returneret en værdi. Første forsøg:

namespace Asy4 public async static Task<int> Test() await Task.Delay(1000); Console.WriteLine("Thread 0 done at 1", Thread.CurrentThread.ManagedThreadId, return 123; int v1 = Test().Result; int v2 = Test().Result; int v3 = Test().Result; Console.WriteLine("Calls completed at 0", Console.WriteLine("0 1 2", v1, v2, v3); Console.WriteLine("Main done at 0", Giver nemlig: Thread 4 done at 11:45:19.336 Thread 4 done at 11:45:20.351 Thread 4 done at 11:45:21.363 Calls completed at 11:45:21.363 123 123 123 Main done at 11:45:24.463 Result laver simpelthen en Wait. Så derfor: namespace Asy5 public async static Task<int> Test()

await Task.Delay(1000); Console.WriteLine("Thread 0 done at 1", Thread.CurrentThread.ManagedThreadId, return 123; Task<int> t1 = Task<int> t2 = Task<int> t3 = Console.WriteLine("Calls completed at 0", int v1 = t1.result; int v2 = t2.result; int v3 = t3.result; Console.WriteLine("0 1 2", v1, v2, v3); Console.WriteLine("Main done at 0", Som giver det ønskede: Calls completed at 11:47:13.962 Thread 4 done at 11:47:14.963 Thread 5 done at 11:47:14.964 Thread 6 done at 11:47:14.964 123 123 123 Main done at 11:47:18.064 For at vise lidt om hvad der sker behind the scene prøver vi nu at lave det samme uden async og await: namespace Asy6 public static Task Test() return Task.Run( () => Thread.Sleep(1000); Console.WriteLine("Thread 0 done at 1", Thread.CurrentThread.ManagedThreadId,

); Console.WriteLine("Calls completed at 0", Console.WriteLine("Main done at 0", og: namespace Asy7 public static Task Test() TaskCompletionSource<string> tcs = new TaskCompletionSource<string>(); Timer t = new Timer(cb => Console.WriteLine("Thread 0 done at 1", Thread.CurrentThread.ManagedThreadId, tcs.setresult("not used"); ); t.change(1000, -1); return tcs.task; Console.WriteLine("Calls completed at 0", Console.WriteLine("Main done at 0",

Udover compiler supporten har Microsoft: - dokumenteret en standard for brug kaldet TAP (Task-based Asynchronous Pattern) - implementeret TAP rigtigt mange steder i Frameworket Der er bl.a. en navne konvention om at asybc metoder har et suffix Async. Eksempel med HTTP: using System.Net; namespace AsyIO1 WebClient wc = new WebClient(); for(int i = 0; i < 3; i++) DateTime dt1 = DateTime.Now; string google = wc.downloadstring("http://www.google.com/"); DateTime dt2 = DateTime.Now; Console.WriteLine((int)(dt2 - dt1).totalmilliseconds); DateTime dt3 = DateTime.Now; Task<string> th = wc.downloadstringtaskasync("http://www.google.com/"); DateTime dt4 = DateTime.Now; string asygoogle = th.result; DateTime dt5 = DateTime.Now; Console.WriteLine((int)(dt4 - dt3).totalmilliseconds + " + " + (int)(dt5 - dt4).totalmilliseconds); Output: 3230 10 + 231 158 0 + 224 154 0 + 159

Vi ser at det er Result der tager tiden ikke DownloadStringTaskAsync som returnerer med det samme. Eksempel med StreamReader: using System.IO; namespace AsyIO2 using(streamwriter sw = new StreamWriter(@"C:\work\big.txt") ) for(int i = 0; i < 10000000; i++) sw.writeline("12345678"); for(int i = 0; i < 3; i++) StreamReader sr = new StreamReader(@"C:\work\big.txt"); DateTime dt1 = DateTime.Now; string src = sr.readtoend(); DateTime dt2 = DateTime.Now; sr.close(); Console.WriteLine((int)(dt2 - dt1).totalmilliseconds); StreamReader asysr = new StreamReader(@"C:\work\big.txt"); DateTime dt3 = DateTime.Now; Task<string> th = asysr.readtoendasync(); DateTime dt4 = DateTime.Now; string asysrc = th.result; DateTime dt5 = DateTime.Now; asysr.close(); Console.WriteLine((int)(dt4 - dt3).totalmilliseconds + " + " + (int)(dt5 - dt4).totalmilliseconds); Output: 476 79 + 6266 511 0 + 6200 533

0 + 6191 Igen er det Result og ikke ReadToEndAsync der tager tiden. Ny HttpClient klasse Den nye HttpClient klasse bruger TAP. Eksempel: using System.Net.Http; namespace E HttpClient hc = new HttpClient(); String google = hc.getstringasync("http://www.google.com//").result; Console.WriteLine(google); Her bruges der så ikke await, men det kan man bruge. WinRT og Modern UI (Metro UI) En anden stor ting i.net 4.5 er at der understøttes WinRT (og det nye UI framework som er kendt som Metro men kommer til at hedde Modern). WinRT (Windows Runtime) er et nyt framework i Windows 8 og 2012. Det er ikke det samme som Windows RT der er en tablet version af Windows 8. WinRT er native (unmanaged code). WinRT er COM baseret. WinRT komponenter implementerer IUnknown som alle COM komponenter gør og IInspectable som er specifik for WinRT komponenter. De implementerer ikke IDispatch (som bruges af VBS og JScript). Meta data gemmes ikke i en.tlb fil som i gamle dage, men i en.winmd fil, som bruger samme format som.net komponenter..net kode kan tilgå WinRT komponenter ligesom.net komponenter og frameworket sørger for den nødvendige glue code.

WinRT bruges af de såkalder Modern UI apps. Modern UI apps og traditionelle desktop apps er to vidt forskellige programmerings modeller. Illustrativ figur: http://i.stack.imgur.com/y7uoi.png Men skiftet fra C# WPF&SL til C# WinRT skulle være meget nemt. Der er nogle tips her: http://msdn.microsoft.com/en-us/library/windows/apps/xaml/br229571.aspx Andet Der er mange andre nye features, men dem må du selv slå op i docs. God kode lyst. Foregående artikler http://www.eksperten.dk/guide/694 om.net 2.0 og C# 2.0 http://www.eksperten.dk/guide/1153 on.net 3.5 og C# 3.0 http://www.eksperten.dk/guide/1330 on.net 4.0 og C# 4.0