SlideShare a Scribd company logo
1 of 39
Copyright © 2006 newtelligence® AG | All rights reserved
Asynchronous ASP.NET
Daniel Fisher(lennybacon)
Software Engineer
newtelligence® AG
Agenda
• Die Synchrone Welt?
• Warum Asynchronität?
• Asynchrone Programmierung mit .NET
• Asynchrone Web-Entwicklung
• Asynchrone System-Architektur
Die Synchrone Welt?
• In der Programmierung „der erste
Schritt“
• Stellen sie sich vor sie geben Ihre
Steuererklärung ab…
 …und warten vor dem Zimmer bis sie ihren
Bescheid in der Hand halten?
• Synchronität in der „realen Welt“ …
 …eine Utopie
Warum Asynchronität?
• Weil nicht schlimmer ist als Warten
• In der Zeit, in der sie auf den Steuerbescheid
warten…
 … führen sie ihr Leben schliesslich auch weiter!
• Waruma also sollten ihre Applikationen
warten?
 Auf eine Kalkulation, die Datenbank, den Host,
einen WebService …
Asynchrone Programmierung mit
.NET
• Prerequisites
 Threads
 Timer
 Delegates
• IAsyncResult design pattern
• AsyncCallbacks
• Event-based Asynchronous Pattern
Threads
• Synchroner Ablauf
• Asynchroner Ablauf*
*Parallele Abfolgen NUR auf Multiprozessor-Maschinen
Threads
• System.Threading.Thread
 Start()
 Sleep()
 Suspend()
 Resume()
 Interupt()
• Wirft Exception
 Abort()
• Wirft nicht abfangbare Exception
• Thread-Objekt kann nicht weiterverwendet werden
Threads
• Treads haben einen „Status“
 Runnable
• Ready
• Standby
• Running
 Not runnable
• Transition
• Waiting
• Terminated
Threads
• Systemkonzept: Pro Prozeß ein
ThreadPool
 Anforderungen an den Pool über eine
Warteschlange
 Muß eine Anforderung länger als eine halbe
Sekunde warten, wird neuer Pool-Thread
erzeugt
• Maximal 100 Threads
• Wird Pool-Thread 30 Sekunden nicht benötigt,
wird Thread aus dem Pool entfernt
Threads
• Ein Thread ist ein unabhängiger
Ausführungspfad innerhalb eines Prozesses
 Jeder Thread besitzt seinen eigenen Kontext
• Stack, Programmzähler, Register etc.
• Threads verrichten Arbeit
 Jeder Prozeß hat einen
• Kann aber beliebig viele haben
• Die Verteilung der Rechenzeit erfolgt auf
Threadbasis
Threads
• Kommunikation zwischen Threads
aufwendig
 Synchronisation ist schwierig
 Nur das Lesen und Schreiben von int ist
atomar
 Alles andere muß synchronisiert werden
Threads
• Synchronisation
 lock{}-Statement
 System.Threading.WaitHandle
• System.Threading.Mutex
• System.Threading.AutoResetEvent
• System.Threading.ManualResetEvent
 System.Threading.Monitor
 System.Runtime.CompilerServices.
MethodImplAttribute
 System.Runtime.Remoting.Contexts.
SynchronisationAttribute
Threads
• Thread kann lokalen, eigenen Speicher
haben
 Dynamisch: Thread Local Storage (TLS)
 Statisch: Thread-spezifische Felder
• Referenztypen möglich, aber problematisch!
• Statischer Konstruktor läuft nur einmal
Threads
class Class1
{
[ThreadStatic]
static int s_Amount
public void Book()
{
LocalDataStoreSlot dataSlot =
Thread.GetNamedDataSlot("MyTlsSlot");
Thread.SetData(dataSlot, 10);
Console.WriteLine(
"Book amount for thread '{0}' = {1}",
Thread.CurrentThread.Name,
(int)Thread.GetData(dataSlot));
}
}
Timer
• System.Threading.Timer
 Periodische Ausführung von Funktionalität
 Status wird in übergebener Objekt-Instanz
gehalten
 Deinitialisierung mit Dispose()
Delegates
• Funktionszeiger
• Basis für Events
• Asynchrone Aufrufe möglich
 IAsyncResult design pattern ...
IAsyncResult design pattern
• Implementierung mit je zwei Methoden
 BeginOperationName
• Startet die asynchrone Operation
• Rückgabewert ist eine implementation von
IAsyncResult
 EndOperationName
• Beendet die asynchrone Operation
• Rückgabewert ist der selbe wie bei der
entsprechenden synchronen Operation
IAsyncResult design pattern
• IAsyncResult hält Informationen über die
asynchrone Operation
 AsyncState
• Optionaler applikations-spezifische Informationen
 AsyncWaitHandle
• Blockt den Zugriff auf Daten solange die Operation läuft
 CompletedSynchronously
• Wurde die Operation auf dem aufrufenden Thread
beendet?
 IsCompleted
• Ist die Operation beendet?
AsyncCallback
• Eigene CallBack-Methode
 Aufruf nach Abschluss der asynchronen
Operation
 Methodensignatur definiert durch einen
delegate
using System.Runtime.InteropServices;
namespace System
{
// Summary:
// References the callback method to be called when
// the asynchronous operation is completed.
[Serializable]
[ComVisible(true)]
public delegate void AsyncCallback(IAsyncResult ar);
}
Event-based Asynchronous Pattern
• Implementierung mit zwei Methoden …
 OperationNameAsync
• Startet die asynchrone Operation
 OperationNameAsyncCancel
• Bricht die laufende Operation ab
• ... und einem Event
 OperationNameCompleted
• Feuert wenn die Operation abgeschlossen ist
Event-based Asynchronous Pattern
• Benutzen
 Objekt instanziieren
 Ereignissbehandlung and event anhängen
 OperationNameAsync aufrufen
using System;
namespace System.ComponentModel
{
/// <summary>Represents the method that will handle the
/// MethodNameCompleted event of an asynchronous operation.
/// </summary>
public delegate void AsyncCompletedEventHandler(
object sender,
AsyncCompletedEventArgs e);
}
Asynchrone Web-Entwicklung
• Asynchrone Methoden in der Web
Applikation aufrufen
 ASP.NET Async Pages
 ASP.NET Async Tasks
• RemoteScripting vs. AJAX
 ASP.NET Client Side Callbacks
 ASP.NET Atlas Framework
ASP.NET Async Pages
• Page-Directive Attribute
• BeginEventHandler und/oder
EndEventHandler mit
AddOnPreRenderCompleteAsync
registrieren
BeginEventHandler bh = new BeginEventHandler(AsyncBeginPage);
EndEventHandler eh = new EndEventHandler(AsyncEndPage);
AddOnPreRenderCompleteAsync(bh, eh);
ASP.NET Async Tasks
• Page-Directive Attribute
• BeginEventHandler und/oder
EndEventHandler als Task mit
RegisterAsyncTask registrieren
PageAsyncTask myTask =
new PageAsyncTask(
AsyncBeginPage, AsyncEndPage,null, null);
RegisterAsyncTask(myTask);
ASP.NET Async …
• Infastruktur zum „Einklinken“ von ansynchron
auszuführendem Code
• „Seamless integration“ of coding model
 Sieht aus wie Page_EventName
 Steht an der gleichen Stelle wie
Page_EventName
 Ist aber asynchron
• 7-10% Performancegewinn
 Durch „bessere Nutzung“ der Threads in
ThreadPool
The Web from the client side
• Nach dem initialen Request/Response und
dem anzeigen der Seite wird bei jedem
„Klick“ ein Request/Response ausgeführt.
• Im „Hintergrund“Daten übertragen.
• Nur Daten übertragen die benötigt werden.
 Keine Navigation, Grafiken oder Markup – Daten.
• Requirements: Scriptingfähigkeit des Browsers
RemoteScripting vs. AJAX
• RemoteScripting
 Ein Java Applet/ActiveX Control leitet
clientseitige Anfragen an den Server
• Nachteil: Java/ActiveX benötigt
• Vorteil: Broadcast möglich
• AJAX
 Javascript: Events und XmlHttpRequests
• Vorteil: NUR Scriptingfähigkeit des Browsers
• Nachteil:
– Keine „Events“ vom Server
– Ugly Code...
AJAX
var request = new Request();
function _getXmlHttp()
{
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
var progids=["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"]
or (i in progids) {
try { return new ActiveXObject(progids[i]) }
catch (e) {}
}
@end @*/
try { return new XMLHttpRequest();}
catch (e2) {return null; }
}
function Request() {
this.Get = Request_get;
this._get = _getXmlHttp();
if (this._get == null) return;
}
...
AJAX
...
ReadyState = { Uninitialized: 0, Loading: 1, Loaded:2, Active:3, Completed: 4 }
HttpStatus = { OK: 200, NotFound: 404 }
function Request_get(url, f_change, method) {
if (!this._get)
return;
if (method == null)
method="GET";
if (this._get.readyState != ReadyState.Uninitialized)
this._get.abort()
this._get.open(method, url, true);
if (f_change != null)
var _get = this._get;
this._get.onreadystatechange = function()
{
f_change(_get);
}
this._get.send(null);
}
AJAX
...
function ajaxInnerHTML(method, args, elmId)
{
request.Get(
url + "?m=" + escape(method) + "&p=" + escape(args),
function(result)
{
if (result.readyState!=ReadyState.Complete)
return;
if (result.status==HttpStatus.OK
&& result.responseText != "")
{
elm = document.getElementById(elmId);
if(elm)
{
var response = result.responseText;
elm.innerHTML = response;
}
}
});
}
AJAX
• Funktioniert nur mit „Ugly Hacks“
 Oder nur mit einem Browser-Typ
• Javascript ist nicht typisiert
• ...
• Codieren wie Ende der 90er?
Welcome to WEB 0.5?
ASP.NET ClientSideCallbacks
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head" runat="server“>
<script type="text/ecmascript">
function ReceiveServerData(rValue){
document.getElementById('Results').innerHTML = rValue;
}
</script>
</head>
<body>
<form id="form1" runat="server“>
<asp:ListBox ID="ListBox1" Runat="server“>
<asp:ListItem Text="Cheese" Value="Cheese" />
</asp:ListBox><br />
Items in stock:
<div id="Results" runat="server“ />
</form>
</body>
ASP.NET ClientSideCallbacks
public partial class _Default : Page, ICallbackEventHandler
{
protected string returnValue;
protected void Page_Load(object sender, EventArgs e)
{
string cb = Page.ClientScript.GetCallbackEventReference(
this, "arg", “ReceiveServerData", "");
ListBox1.Attributes["onchange"] =
cb.Replace(
"arg", "this.options[this.selectedIndex].text");
}
public void RaiseCallbackEvent(string eventArgument){
returnValue = "10";
}
public string GetCallbackResult(){
return returnValue;
}
}
Atlas
• Eine Serverseitiges Framework für AJAX
 Plattform und Browser-Kompatibel
 Objektorientierte Serverseitige API
 Declaratives model
• Steuerelemente
 Toolunterstützung für Designer und
Entwickler
 Kostenlos, Supported, Einfach zu benutzen
Atlas
• ASPX
• CodeBehind
<atlas:ScriptManager ID="sm1" runat="server" EnablePartialRendering="true" />
<atlas:UpdatePanel ID="up1" runat="server">
<ContentTemplate>
<asp:Button ID=“B" Text="GetData" runat="server" OnClick=“B_Click" />
<br />
<asp:Label ID="Message" runat="server" />
</ContentTemplate>
</atlas:UpdatePanel>
public partial class _Default : System.Web.UI.Page
{
protected void B_Click(object sender, EventArgs e)
{
Message.Text = "Button1 was clicked";
}
}
Asynchrone System-Architekturen
• Web-Server – Applikations-Server-Topologie
 Synchron
 Asynchron
• Entkoppelung durch MessageQueing
ASP.NET und MessageQueing
• Anfrage in RequestQueue schreiben
• Warten auf eine Antwort:
using (MessageQueue responseQueue = new MessageQueue(queuePath))
{
responseQueue.MessageReadPropertyFilter.CorrelationId = true;
Message objMessage =
responseQueue.ReceiveByCorrelationId(
correlationId,
new TimeSpan(0, 0, 0, timeOut),
MessageQueueTransactionType.None);
}
Fazit
Copyright © 2006 newtelligence® AG | All rights reserved
Copyright © 2006 newtelligence® AG | All rights reserved

More Related Content

Viewers also liked

2010 - Basta: ASP.NET Controls für Web Forms und MVC
2010 - Basta: ASP.NET Controls für Web Forms und MVC2010 - Basta: ASP.NET Controls für Web Forms und MVC
2010 - Basta: ASP.NET Controls für Web Forms und MVCDaniel Fisher
 
2005 - .NET SummerCamp: Web developmentwith IIS & ASP.NET webservices
2005 - .NET SummerCamp: Web developmentwith IIS & ASP.NET webservices2005 - .NET SummerCamp: Web developmentwith IIS & ASP.NET webservices
2005 - .NET SummerCamp: Web developmentwith IIS & ASP.NET webservicesDaniel Fisher
 
2009 - Basta!: Url rewriting mit iis, asp.net und routing engine
2009 - Basta!: Url rewriting mit iis, asp.net und routing engine2009 - Basta!: Url rewriting mit iis, asp.net und routing engine
2009 - Basta!: Url rewriting mit iis, asp.net und routing engineDaniel Fisher
 
2006 - DDD4: Decoupling service oriented backend systems
2006 - DDD4: Decoupling service oriented backend systems2006 - DDD4: Decoupling service oriented backend systems
2006 - DDD4: Decoupling service oriented backend systemsDaniel Fisher
 
2008 - TechDays PT: Building Software + Services with Volta
2008 - TechDays PT: Building Software + Services with Volta2008 - TechDays PT: Building Software + Services with Volta
2008 - TechDays PT: Building Software + Services with VoltaDaniel Fisher
 
2009 - DNC: Silverlight ohne UI - Nur als Cache
2009 - DNC: Silverlight ohne UI - Nur als Cache2009 - DNC: Silverlight ohne UI - Nur als Cache
2009 - DNC: Silverlight ohne UI - Nur als CacheDaniel Fisher
 
2015 TechSummit Web & Cloud - Gem, NPM, Bower, Nuget, Paket - Päckchen hier, ...
2015 TechSummit Web & Cloud - Gem, NPM, Bower, Nuget, Paket - Päckchen hier, ...2015 TechSummit Web & Cloud - Gem, NPM, Bower, Nuget, Paket - Päckchen hier, ...
2015 TechSummit Web & Cloud - Gem, NPM, Bower, Nuget, Paket - Päckchen hier, ...Daniel Fisher
 
2011 - Dotnet Information Day: NUGET
2011 - Dotnet Information Day: NUGET2011 - Dotnet Information Day: NUGET
2011 - Dotnet Information Day: NUGETDaniel Fisher
 
2010 - Basta!: REST mit ASP.NET MVC
2010 - Basta!: REST mit ASP.NET MVC2010 - Basta!: REST mit ASP.NET MVC
2010 - Basta!: REST mit ASP.NET MVCDaniel Fisher
 
2011 - DNC: REST Wars
2011 - DNC: REST Wars2011 - DNC: REST Wars
2011 - DNC: REST WarsDaniel Fisher
 
2007 - Basta!: Nach soa kommt soc
2007 - Basta!: Nach soa kommt soc2007 - Basta!: Nach soa kommt soc
2007 - Basta!: Nach soa kommt socDaniel Fisher
 
2006 - Basta!: Advanced server controls
2006 - Basta!: Advanced server controls2006 - Basta!: Advanced server controls
2006 - Basta!: Advanced server controlsDaniel Fisher
 
2008 - TechDays PT: Modeling and Composition for Software today and tomorrow
2008 - TechDays PT: Modeling and Composition for Software today and tomorrow2008 - TechDays PT: Modeling and Composition for Software today and tomorrow
2008 - TechDays PT: Modeling and Composition for Software today and tomorrowDaniel Fisher
 
2005 - NRW Conf: Design, Entwicklung und Tests
2005 - NRW Conf: Design, Entwicklung und Tests2005 - NRW Conf: Design, Entwicklung und Tests
2005 - NRW Conf: Design, Entwicklung und TestsDaniel Fisher
 
2008 - Basta!: DAL DIY
2008 - Basta!: DAL DIY2008 - Basta!: DAL DIY
2008 - Basta!: DAL DIYDaniel Fisher
 
Unit 7 lesson d
Unit 7  lesson dUnit 7  lesson d
Unit 7 lesson dmyquintero
 
Unit 7 lesson d
Unit 7  lesson dUnit 7  lesson d
Unit 7 lesson dmyquintero
 
2015 - Network 2015, UA: Defensive programming, resilience patterns & antifra...
2015 - Network 2015, UA: Defensive programming, resilience patterns & antifra...2015 - Network 2015, UA: Defensive programming, resilience patterns & antifra...
2015 - Network 2015, UA: Defensive programming, resilience patterns & antifra...Daniel Fisher
 

Viewers also liked (20)

2010 - Basta: ASP.NET Controls für Web Forms und MVC
2010 - Basta: ASP.NET Controls für Web Forms und MVC2010 - Basta: ASP.NET Controls für Web Forms und MVC
2010 - Basta: ASP.NET Controls für Web Forms und MVC
 
2005 - .NET SummerCamp: Web developmentwith IIS & ASP.NET webservices
2005 - .NET SummerCamp: Web developmentwith IIS & ASP.NET webservices2005 - .NET SummerCamp: Web developmentwith IIS & ASP.NET webservices
2005 - .NET SummerCamp: Web developmentwith IIS & ASP.NET webservices
 
2009 - Basta!: Url rewriting mit iis, asp.net und routing engine
2009 - Basta!: Url rewriting mit iis, asp.net und routing engine2009 - Basta!: Url rewriting mit iis, asp.net und routing engine
2009 - Basta!: Url rewriting mit iis, asp.net und routing engine
 
2006 - DDD4: Decoupling service oriented backend systems
2006 - DDD4: Decoupling service oriented backend systems2006 - DDD4: Decoupling service oriented backend systems
2006 - DDD4: Decoupling service oriented backend systems
 
2008 - TechDays PT: Building Software + Services with Volta
2008 - TechDays PT: Building Software + Services with Volta2008 - TechDays PT: Building Software + Services with Volta
2008 - TechDays PT: Building Software + Services with Volta
 
2009 - DNC: Silverlight ohne UI - Nur als Cache
2009 - DNC: Silverlight ohne UI - Nur als Cache2009 - DNC: Silverlight ohne UI - Nur als Cache
2009 - DNC: Silverlight ohne UI - Nur als Cache
 
2015 TechSummit Web & Cloud - Gem, NPM, Bower, Nuget, Paket - Päckchen hier, ...
2015 TechSummit Web & Cloud - Gem, NPM, Bower, Nuget, Paket - Päckchen hier, ...2015 TechSummit Web & Cloud - Gem, NPM, Bower, Nuget, Paket - Päckchen hier, ...
2015 TechSummit Web & Cloud - Gem, NPM, Bower, Nuget, Paket - Päckchen hier, ...
 
2011 - Dotnet Information Day: NUGET
2011 - Dotnet Information Day: NUGET2011 - Dotnet Information Day: NUGET
2011 - Dotnet Information Day: NUGET
 
2010 - Basta!: REST mit ASP.NET MVC
2010 - Basta!: REST mit ASP.NET MVC2010 - Basta!: REST mit ASP.NET MVC
2010 - Basta!: REST mit ASP.NET MVC
 
2011 - DNC: REST Wars
2011 - DNC: REST Wars2011 - DNC: REST Wars
2011 - DNC: REST Wars
 
2007 - Basta!: Nach soa kommt soc
2007 - Basta!: Nach soa kommt soc2007 - Basta!: Nach soa kommt soc
2007 - Basta!: Nach soa kommt soc
 
2006 - Basta!: Advanced server controls
2006 - Basta!: Advanced server controls2006 - Basta!: Advanced server controls
2006 - Basta!: Advanced server controls
 
2008 - TechDays PT: Modeling and Composition for Software today and tomorrow
2008 - TechDays PT: Modeling and Composition for Software today and tomorrow2008 - TechDays PT: Modeling and Composition for Software today and tomorrow
2008 - TechDays PT: Modeling and Composition for Software today and tomorrow
 
2005 - NRW Conf: Design, Entwicklung und Tests
2005 - NRW Conf: Design, Entwicklung und Tests2005 - NRW Conf: Design, Entwicklung und Tests
2005 - NRW Conf: Design, Entwicklung und Tests
 
2008 - Basta!: DAL DIY
2008 - Basta!: DAL DIY2008 - Basta!: DAL DIY
2008 - Basta!: DAL DIY
 
personal visual resume
personal visual resumepersonal visual resume
personal visual resume
 
Unit 7 lesson d
Unit 7  lesson dUnit 7  lesson d
Unit 7 lesson d
 
Unit 7 lesson d
Unit 7  lesson dUnit 7  lesson d
Unit 7 lesson d
 
My Cool Visual Resume
My Cool Visual ResumeMy Cool Visual Resume
My Cool Visual Resume
 
2015 - Network 2015, UA: Defensive programming, resilience patterns & antifra...
2015 - Network 2015, UA: Defensive programming, resilience patterns & antifra...2015 - Network 2015, UA: Defensive programming, resilience patterns & antifra...
2015 - Network 2015, UA: Defensive programming, resilience patterns & antifra...
 

Similar to 2006 - NRW Conf: Asynchronous asp.net

Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...OPEN KNOWLEDGE GmbH
 
HTML5 und node.js Grundlagen
HTML5 und node.js GrundlagenHTML5 und node.js Grundlagen
HTML5 und node.js GrundlagenMayflower GmbH
 
Übersicht Skriptsprachen
Übersicht SkriptsprachenÜbersicht Skriptsprachen
Übersicht SkriptsprachenA. LE
 
Backend-Services mit Rust
Backend-Services mit RustBackend-Services mit Rust
Backend-Services mit RustJens Siebert
 
Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010Dirk Ginader
 
Einführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungEinführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungDigicomp Academy AG
 
Reaktive Applikationen mit Scala, Play und Akka
Reaktive Applikationen mit Scala, Play und AkkaReaktive Applikationen mit Scala, Play und Akka
Reaktive Applikationen mit Scala, Play und AkkaMarkus Klink
 
Prometheus Monitoring
Prometheus MonitoringPrometheus Monitoring
Prometheus Monitoringinovex GmbH
 
XML-Socket-Server zur Kommunikation mit Flash
XML-Socket-Server zur Kommunikation mit FlashXML-Socket-Server zur Kommunikation mit Flash
XML-Socket-Server zur Kommunikation mit FlashStephan Schmidt
 
Parallele Softwareentwicklung mit .NET 4.0
Parallele Softwareentwicklung mit .NET 4.0Parallele Softwareentwicklung mit .NET 4.0
Parallele Softwareentwicklung mit .NET 4.0Qiong Wu
 
JMeter + ELK - Event-basierte Daten != Logfiles in ELK
JMeter + ELK - Event-basierte Daten != Logfiles in ELKJMeter + ELK - Event-basierte Daten != Logfiles in ELK
JMeter + ELK - Event-basierte Daten != Logfiles in ELKinovex GmbH
 
Prototype 1.7
Prototype 1.7Prototype 1.7
Prototype 1.7msebel
 
Skalierbare Anwendungen mit Google Go
Skalierbare Anwendungen mit Google GoSkalierbare Anwendungen mit Google Go
Skalierbare Anwendungen mit Google GoFrank Müller
 
Apple iOS - Webservices
Apple iOS - WebservicesApple iOS - Webservices
Apple iOS - Webservicesmesseb
 
Microservices mit Rust
Microservices mit RustMicroservices mit Rust
Microservices mit RustJens Siebert
 

Similar to 2006 - NRW Conf: Asynchronous asp.net (20)

node.js
node.jsnode.js
node.js
 
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
 
HTML5 und node.js Grundlagen
HTML5 und node.js GrundlagenHTML5 und node.js Grundlagen
HTML5 und node.js Grundlagen
 
Übersicht Skriptsprachen
Übersicht SkriptsprachenÜbersicht Skriptsprachen
Übersicht Skriptsprachen
 
Backend-Services mit Rust
Backend-Services mit RustBackend-Services mit Rust
Backend-Services mit Rust
 
Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010
 
Einführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungEinführung in die funktionale Programmierung
Einführung in die funktionale Programmierung
 
Reaktive Applikationen mit Scala, Play und Akka
Reaktive Applikationen mit Scala, Play und AkkaReaktive Applikationen mit Scala, Play und Akka
Reaktive Applikationen mit Scala, Play und Akka
 
Prometheus Monitoring
Prometheus MonitoringPrometheus Monitoring
Prometheus Monitoring
 
Webapplikationen mit Node.js
Webapplikationen mit Node.jsWebapplikationen mit Node.js
Webapplikationen mit Node.js
 
XML-Socket-Server zur Kommunikation mit Flash
XML-Socket-Server zur Kommunikation mit FlashXML-Socket-Server zur Kommunikation mit Flash
XML-Socket-Server zur Kommunikation mit Flash
 
Parallele Softwareentwicklung mit .NET 4.0
Parallele Softwareentwicklung mit .NET 4.0Parallele Softwareentwicklung mit .NET 4.0
Parallele Softwareentwicklung mit .NET 4.0
 
JMeter + ELK - Event-basierte Daten != Logfiles in ELK
JMeter + ELK - Event-basierte Daten != Logfiles in ELKJMeter + ELK - Event-basierte Daten != Logfiles in ELK
JMeter + ELK - Event-basierte Daten != Logfiles in ELK
 
Node.js
Node.jsNode.js
Node.js
 
Prototype 1.7
Prototype 1.7Prototype 1.7
Prototype 1.7
 
Skalierbare Anwendungen mit Google Go
Skalierbare Anwendungen mit Google GoSkalierbare Anwendungen mit Google Go
Skalierbare Anwendungen mit Google Go
 
Wicket Kurzübersicht
Wicket KurzübersichtWicket Kurzübersicht
Wicket Kurzübersicht
 
Apple iOS - Webservices
Apple iOS - WebservicesApple iOS - Webservices
Apple iOS - Webservices
 
OpenCL Grundlagen
OpenCL GrundlagenOpenCL Grundlagen
OpenCL Grundlagen
 
Microservices mit Rust
Microservices mit RustMicroservices mit Rust
Microservices mit Rust
 

More from Daniel Fisher

MD DevdDays 2016: Defensive programming, resilience patterns & antifragility
MD DevdDays 2016: Defensive programming, resilience patterns & antifragilityMD DevdDays 2016: Defensive programming, resilience patterns & antifragility
MD DevdDays 2016: Defensive programming, resilience patterns & antifragilityDaniel Fisher
 
NRWConf, DE: Defensive programming, resilience patterns & antifragility
NRWConf, DE: Defensive programming, resilience patterns & antifragilityNRWConf, DE: Defensive programming, resilience patterns & antifragility
NRWConf, DE: Defensive programming, resilience patterns & antifragilityDaniel Fisher
 
.NET Developer Days 2015, PL: Defensive programming, resilience patterns & an...
.NET Developer Days 2015, PL: Defensive programming, resilience patterns & an....NET Developer Days 2015, PL: Defensive programming, resilience patterns & an...
.NET Developer Days 2015, PL: Defensive programming, resilience patterns & an...Daniel Fisher
 
2015 - Basta! 2015, DE: JavaScript und build
2015 - Basta! 2015, DE: JavaScript und build2015 - Basta! 2015, DE: JavaScript und build
2015 - Basta! 2015, DE: JavaScript und buildDaniel Fisher
 
2015 - Basta! 2015, DE: Defensive programming, resilience patterns & antifrag...
2015 - Basta! 2015, DE: Defensive programming, resilience patterns & antifrag...2015 - Basta! 2015, DE: Defensive programming, resilience patterns & antifrag...
2015 - Basta! 2015, DE: Defensive programming, resilience patterns & antifrag...Daniel Fisher
 
2011 - DotNetFranken: ASP.NET MVC Localization
2011 - DotNetFranken: ASP.NET MVC Localization2011 - DotNetFranken: ASP.NET MVC Localization
2011 - DotNetFranken: ASP.NET MVC LocalizationDaniel Fisher
 
2011 NetUG HH: ASP.NET MVC & HTML 5
2011 NetUG HH: ASP.NET MVC & HTML 52011 NetUG HH: ASP.NET MVC & HTML 5
2011 NetUG HH: ASP.NET MVC & HTML 5Daniel Fisher
 
2010 - Basta!: REST mit WCF 4, Silverlight und AJAX
2010 - Basta!: REST mit WCF 4, Silverlight und AJAX2010 - Basta!: REST mit WCF 4, Silverlight und AJAX
2010 - Basta!: REST mit WCF 4, Silverlight und AJAXDaniel Fisher
 
2010 - Basta!: IPhone Apps mit C#
2010 - Basta!: IPhone Apps mit C#2010 - Basta!: IPhone Apps mit C#
2010 - Basta!: IPhone Apps mit C#Daniel Fisher
 
2010 Basta!: Massendaten mit ADO.NET
2010 Basta!: Massendaten mit ADO.NET2010 Basta!: Massendaten mit ADO.NET
2010 Basta!: Massendaten mit ADO.NETDaniel Fisher
 
2009 - Microsoft Springbreak: IIS, PHP & WCF
2009 - Microsoft Springbreak: IIS, PHP & WCF2009 - Microsoft Springbreak: IIS, PHP & WCF
2009 - Microsoft Springbreak: IIS, PHP & WCFDaniel Fisher
 
2009 - NRW Conf: (ASP).NET Membership
2009 - NRW Conf: (ASP).NET Membership2009 - NRW Conf: (ASP).NET Membership
2009 - NRW Conf: (ASP).NET MembershipDaniel Fisher
 
2009 Dotnet Information Day: More effective c#
2009 Dotnet Information Day: More effective c#2009 Dotnet Information Day: More effective c#
2009 Dotnet Information Day: More effective c#Daniel Fisher
 
2009 - Basta!: Agiles requirements engineering
2009 - Basta!: Agiles requirements engineering2009 - Basta!: Agiles requirements engineering
2009 - Basta!: Agiles requirements engineeringDaniel Fisher
 
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageabilityDaniel Fisher
 
2008 - Basta!: Massendaten auf dem Client
2008 - Basta!: Massendaten auf dem Client2008 - Basta!: Massendaten auf dem Client
2008 - Basta!: Massendaten auf dem ClientDaniel Fisher
 
2008 - Afterlaunch: 10 Tipps für WCF
2008 - Afterlaunch: 10 Tipps für WCF2008 - Afterlaunch: 10 Tipps für WCF
2008 - Afterlaunch: 10 Tipps für WCFDaniel Fisher
 
2006 DDD4: Data access layers - Convenience vs. Control and Performance?
2006 DDD4: Data access layers - Convenience vs. Control and Performance?2006 DDD4: Data access layers - Convenience vs. Control and Performance?
2006 DDD4: Data access layers - Convenience vs. Control and Performance?Daniel Fisher
 

More from Daniel Fisher (18)

MD DevdDays 2016: Defensive programming, resilience patterns & antifragility
MD DevdDays 2016: Defensive programming, resilience patterns & antifragilityMD DevdDays 2016: Defensive programming, resilience patterns & antifragility
MD DevdDays 2016: Defensive programming, resilience patterns & antifragility
 
NRWConf, DE: Defensive programming, resilience patterns & antifragility
NRWConf, DE: Defensive programming, resilience patterns & antifragilityNRWConf, DE: Defensive programming, resilience patterns & antifragility
NRWConf, DE: Defensive programming, resilience patterns & antifragility
 
.NET Developer Days 2015, PL: Defensive programming, resilience patterns & an...
.NET Developer Days 2015, PL: Defensive programming, resilience patterns & an....NET Developer Days 2015, PL: Defensive programming, resilience patterns & an...
.NET Developer Days 2015, PL: Defensive programming, resilience patterns & an...
 
2015 - Basta! 2015, DE: JavaScript und build
2015 - Basta! 2015, DE: JavaScript und build2015 - Basta! 2015, DE: JavaScript und build
2015 - Basta! 2015, DE: JavaScript und build
 
2015 - Basta! 2015, DE: Defensive programming, resilience patterns & antifrag...
2015 - Basta! 2015, DE: Defensive programming, resilience patterns & antifrag...2015 - Basta! 2015, DE: Defensive programming, resilience patterns & antifrag...
2015 - Basta! 2015, DE: Defensive programming, resilience patterns & antifrag...
 
2011 - DotNetFranken: ASP.NET MVC Localization
2011 - DotNetFranken: ASP.NET MVC Localization2011 - DotNetFranken: ASP.NET MVC Localization
2011 - DotNetFranken: ASP.NET MVC Localization
 
2011 NetUG HH: ASP.NET MVC & HTML 5
2011 NetUG HH: ASP.NET MVC & HTML 52011 NetUG HH: ASP.NET MVC & HTML 5
2011 NetUG HH: ASP.NET MVC & HTML 5
 
2010 - Basta!: REST mit WCF 4, Silverlight und AJAX
2010 - Basta!: REST mit WCF 4, Silverlight und AJAX2010 - Basta!: REST mit WCF 4, Silverlight und AJAX
2010 - Basta!: REST mit WCF 4, Silverlight und AJAX
 
2010 - Basta!: IPhone Apps mit C#
2010 - Basta!: IPhone Apps mit C#2010 - Basta!: IPhone Apps mit C#
2010 - Basta!: IPhone Apps mit C#
 
2010 Basta!: Massendaten mit ADO.NET
2010 Basta!: Massendaten mit ADO.NET2010 Basta!: Massendaten mit ADO.NET
2010 Basta!: Massendaten mit ADO.NET
 
2009 - Microsoft Springbreak: IIS, PHP & WCF
2009 - Microsoft Springbreak: IIS, PHP & WCF2009 - Microsoft Springbreak: IIS, PHP & WCF
2009 - Microsoft Springbreak: IIS, PHP & WCF
 
2009 - NRW Conf: (ASP).NET Membership
2009 - NRW Conf: (ASP).NET Membership2009 - NRW Conf: (ASP).NET Membership
2009 - NRW Conf: (ASP).NET Membership
 
2009 Dotnet Information Day: More effective c#
2009 Dotnet Information Day: More effective c#2009 Dotnet Information Day: More effective c#
2009 Dotnet Information Day: More effective c#
 
2009 - Basta!: Agiles requirements engineering
2009 - Basta!: Agiles requirements engineering2009 - Basta!: Agiles requirements engineering
2009 - Basta!: Agiles requirements engineering
 
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
 
2008 - Basta!: Massendaten auf dem Client
2008 - Basta!: Massendaten auf dem Client2008 - Basta!: Massendaten auf dem Client
2008 - Basta!: Massendaten auf dem Client
 
2008 - Afterlaunch: 10 Tipps für WCF
2008 - Afterlaunch: 10 Tipps für WCF2008 - Afterlaunch: 10 Tipps für WCF
2008 - Afterlaunch: 10 Tipps für WCF
 
2006 DDD4: Data access layers - Convenience vs. Control and Performance?
2006 DDD4: Data access layers - Convenience vs. Control and Performance?2006 DDD4: Data access layers - Convenience vs. Control and Performance?
2006 DDD4: Data access layers - Convenience vs. Control and Performance?
 

2006 - NRW Conf: Asynchronous asp.net

  • 1. Copyright © 2006 newtelligence® AG | All rights reserved Asynchronous ASP.NET Daniel Fisher(lennybacon) Software Engineer newtelligence® AG
  • 2. Agenda • Die Synchrone Welt? • Warum Asynchronität? • Asynchrone Programmierung mit .NET • Asynchrone Web-Entwicklung • Asynchrone System-Architektur
  • 3. Die Synchrone Welt? • In der Programmierung „der erste Schritt“ • Stellen sie sich vor sie geben Ihre Steuererklärung ab…  …und warten vor dem Zimmer bis sie ihren Bescheid in der Hand halten? • Synchronität in der „realen Welt“ …  …eine Utopie
  • 4. Warum Asynchronität? • Weil nicht schlimmer ist als Warten • In der Zeit, in der sie auf den Steuerbescheid warten…  … führen sie ihr Leben schliesslich auch weiter! • Waruma also sollten ihre Applikationen warten?  Auf eine Kalkulation, die Datenbank, den Host, einen WebService …
  • 5. Asynchrone Programmierung mit .NET • Prerequisites  Threads  Timer  Delegates • IAsyncResult design pattern • AsyncCallbacks • Event-based Asynchronous Pattern
  • 6. Threads • Synchroner Ablauf • Asynchroner Ablauf* *Parallele Abfolgen NUR auf Multiprozessor-Maschinen
  • 7. Threads • System.Threading.Thread  Start()  Sleep()  Suspend()  Resume()  Interupt() • Wirft Exception  Abort() • Wirft nicht abfangbare Exception • Thread-Objekt kann nicht weiterverwendet werden
  • 8. Threads • Treads haben einen „Status“  Runnable • Ready • Standby • Running  Not runnable • Transition • Waiting • Terminated
  • 9. Threads • Systemkonzept: Pro Prozeß ein ThreadPool  Anforderungen an den Pool über eine Warteschlange  Muß eine Anforderung länger als eine halbe Sekunde warten, wird neuer Pool-Thread erzeugt • Maximal 100 Threads • Wird Pool-Thread 30 Sekunden nicht benötigt, wird Thread aus dem Pool entfernt
  • 10. Threads • Ein Thread ist ein unabhängiger Ausführungspfad innerhalb eines Prozesses  Jeder Thread besitzt seinen eigenen Kontext • Stack, Programmzähler, Register etc. • Threads verrichten Arbeit  Jeder Prozeß hat einen • Kann aber beliebig viele haben • Die Verteilung der Rechenzeit erfolgt auf Threadbasis
  • 11. Threads • Kommunikation zwischen Threads aufwendig  Synchronisation ist schwierig  Nur das Lesen und Schreiben von int ist atomar  Alles andere muß synchronisiert werden
  • 12. Threads • Synchronisation  lock{}-Statement  System.Threading.WaitHandle • System.Threading.Mutex • System.Threading.AutoResetEvent • System.Threading.ManualResetEvent  System.Threading.Monitor  System.Runtime.CompilerServices. MethodImplAttribute  System.Runtime.Remoting.Contexts. SynchronisationAttribute
  • 13. Threads • Thread kann lokalen, eigenen Speicher haben  Dynamisch: Thread Local Storage (TLS)  Statisch: Thread-spezifische Felder • Referenztypen möglich, aber problematisch! • Statischer Konstruktor läuft nur einmal
  • 14. Threads class Class1 { [ThreadStatic] static int s_Amount public void Book() { LocalDataStoreSlot dataSlot = Thread.GetNamedDataSlot("MyTlsSlot"); Thread.SetData(dataSlot, 10); Console.WriteLine( "Book amount for thread '{0}' = {1}", Thread.CurrentThread.Name, (int)Thread.GetData(dataSlot)); } }
  • 15. Timer • System.Threading.Timer  Periodische Ausführung von Funktionalität  Status wird in übergebener Objekt-Instanz gehalten  Deinitialisierung mit Dispose()
  • 16. Delegates • Funktionszeiger • Basis für Events • Asynchrone Aufrufe möglich  IAsyncResult design pattern ...
  • 17. IAsyncResult design pattern • Implementierung mit je zwei Methoden  BeginOperationName • Startet die asynchrone Operation • Rückgabewert ist eine implementation von IAsyncResult  EndOperationName • Beendet die asynchrone Operation • Rückgabewert ist der selbe wie bei der entsprechenden synchronen Operation
  • 18. IAsyncResult design pattern • IAsyncResult hält Informationen über die asynchrone Operation  AsyncState • Optionaler applikations-spezifische Informationen  AsyncWaitHandle • Blockt den Zugriff auf Daten solange die Operation läuft  CompletedSynchronously • Wurde die Operation auf dem aufrufenden Thread beendet?  IsCompleted • Ist die Operation beendet?
  • 19. AsyncCallback • Eigene CallBack-Methode  Aufruf nach Abschluss der asynchronen Operation  Methodensignatur definiert durch einen delegate using System.Runtime.InteropServices; namespace System { // Summary: // References the callback method to be called when // the asynchronous operation is completed. [Serializable] [ComVisible(true)] public delegate void AsyncCallback(IAsyncResult ar); }
  • 20. Event-based Asynchronous Pattern • Implementierung mit zwei Methoden …  OperationNameAsync • Startet die asynchrone Operation  OperationNameAsyncCancel • Bricht die laufende Operation ab • ... und einem Event  OperationNameCompleted • Feuert wenn die Operation abgeschlossen ist
  • 21. Event-based Asynchronous Pattern • Benutzen  Objekt instanziieren  Ereignissbehandlung and event anhängen  OperationNameAsync aufrufen using System; namespace System.ComponentModel { /// <summary>Represents the method that will handle the /// MethodNameCompleted event of an asynchronous operation. /// </summary> public delegate void AsyncCompletedEventHandler( object sender, AsyncCompletedEventArgs e); }
  • 22. Asynchrone Web-Entwicklung • Asynchrone Methoden in der Web Applikation aufrufen  ASP.NET Async Pages  ASP.NET Async Tasks • RemoteScripting vs. AJAX  ASP.NET Client Side Callbacks  ASP.NET Atlas Framework
  • 23. ASP.NET Async Pages • Page-Directive Attribute • BeginEventHandler und/oder EndEventHandler mit AddOnPreRenderCompleteAsync registrieren BeginEventHandler bh = new BeginEventHandler(AsyncBeginPage); EndEventHandler eh = new EndEventHandler(AsyncEndPage); AddOnPreRenderCompleteAsync(bh, eh);
  • 24. ASP.NET Async Tasks • Page-Directive Attribute • BeginEventHandler und/oder EndEventHandler als Task mit RegisterAsyncTask registrieren PageAsyncTask myTask = new PageAsyncTask( AsyncBeginPage, AsyncEndPage,null, null); RegisterAsyncTask(myTask);
  • 25. ASP.NET Async … • Infastruktur zum „Einklinken“ von ansynchron auszuführendem Code • „Seamless integration“ of coding model  Sieht aus wie Page_EventName  Steht an der gleichen Stelle wie Page_EventName  Ist aber asynchron • 7-10% Performancegewinn  Durch „bessere Nutzung“ der Threads in ThreadPool
  • 26. The Web from the client side • Nach dem initialen Request/Response und dem anzeigen der Seite wird bei jedem „Klick“ ein Request/Response ausgeführt. • Im „Hintergrund“Daten übertragen. • Nur Daten übertragen die benötigt werden.  Keine Navigation, Grafiken oder Markup – Daten. • Requirements: Scriptingfähigkeit des Browsers
  • 27. RemoteScripting vs. AJAX • RemoteScripting  Ein Java Applet/ActiveX Control leitet clientseitige Anfragen an den Server • Nachteil: Java/ActiveX benötigt • Vorteil: Broadcast möglich • AJAX  Javascript: Events und XmlHttpRequests • Vorteil: NUR Scriptingfähigkeit des Browsers • Nachteil: – Keine „Events“ vom Server – Ugly Code...
  • 28. AJAX var request = new Request(); function _getXmlHttp() { /*@cc_on @*/ /*@if (@_jscript_version >= 5) var progids=["Msxml2.XMLHTTP", "Microsoft.XMLHTTP"] or (i in progids) { try { return new ActiveXObject(progids[i]) } catch (e) {} } @end @*/ try { return new XMLHttpRequest();} catch (e2) {return null; } } function Request() { this.Get = Request_get; this._get = _getXmlHttp(); if (this._get == null) return; } ...
  • 29. AJAX ... ReadyState = { Uninitialized: 0, Loading: 1, Loaded:2, Active:3, Completed: 4 } HttpStatus = { OK: 200, NotFound: 404 } function Request_get(url, f_change, method) { if (!this._get) return; if (method == null) method="GET"; if (this._get.readyState != ReadyState.Uninitialized) this._get.abort() this._get.open(method, url, true); if (f_change != null) var _get = this._get; this._get.onreadystatechange = function() { f_change(_get); } this._get.send(null); }
  • 30. AJAX ... function ajaxInnerHTML(method, args, elmId) { request.Get( url + "?m=" + escape(method) + "&p=" + escape(args), function(result) { if (result.readyState!=ReadyState.Complete) return; if (result.status==HttpStatus.OK && result.responseText != "") { elm = document.getElementById(elmId); if(elm) { var response = result.responseText; elm.innerHTML = response; } } }); }
  • 31. AJAX • Funktioniert nur mit „Ugly Hacks“  Oder nur mit einem Browser-Typ • Javascript ist nicht typisiert • ... • Codieren wie Ende der 90er? Welcome to WEB 0.5?
  • 32. ASP.NET ClientSideCallbacks <html xmlns="http://www.w3.org/1999/xhtml"> <head id="Head" runat="server“> <script type="text/ecmascript"> function ReceiveServerData(rValue){ document.getElementById('Results').innerHTML = rValue; } </script> </head> <body> <form id="form1" runat="server“> <asp:ListBox ID="ListBox1" Runat="server“> <asp:ListItem Text="Cheese" Value="Cheese" /> </asp:ListBox><br /> Items in stock: <div id="Results" runat="server“ /> </form> </body>
  • 33. ASP.NET ClientSideCallbacks public partial class _Default : Page, ICallbackEventHandler { protected string returnValue; protected void Page_Load(object sender, EventArgs e) { string cb = Page.ClientScript.GetCallbackEventReference( this, "arg", “ReceiveServerData", ""); ListBox1.Attributes["onchange"] = cb.Replace( "arg", "this.options[this.selectedIndex].text"); } public void RaiseCallbackEvent(string eventArgument){ returnValue = "10"; } public string GetCallbackResult(){ return returnValue; } }
  • 34. Atlas • Eine Serverseitiges Framework für AJAX  Plattform und Browser-Kompatibel  Objektorientierte Serverseitige API  Declaratives model • Steuerelemente  Toolunterstützung für Designer und Entwickler  Kostenlos, Supported, Einfach zu benutzen
  • 35. Atlas • ASPX • CodeBehind <atlas:ScriptManager ID="sm1" runat="server" EnablePartialRendering="true" /> <atlas:UpdatePanel ID="up1" runat="server"> <ContentTemplate> <asp:Button ID=“B" Text="GetData" runat="server" OnClick=“B_Click" /> <br /> <asp:Label ID="Message" runat="server" /> </ContentTemplate> </atlas:UpdatePanel> public partial class _Default : System.Web.UI.Page { protected void B_Click(object sender, EventArgs e) { Message.Text = "Button1 was clicked"; } }
  • 36. Asynchrone System-Architekturen • Web-Server – Applikations-Server-Topologie  Synchron  Asynchron • Entkoppelung durch MessageQueing
  • 37. ASP.NET und MessageQueing • Anfrage in RequestQueue schreiben • Warten auf eine Antwort: using (MessageQueue responseQueue = new MessageQueue(queuePath)) { responseQueue.MessageReadPropertyFilter.CorrelationId = true; Message objMessage = responseQueue.ReceiveByCorrelationId( correlationId, new TimeSpan(0, 0, 0, timeOut), MessageQueueTransactionType.None); }
  • 38. Fazit Copyright © 2006 newtelligence® AG | All rights reserved
  • 39. Copyright © 2006 newtelligence® AG | All rights reserved

Editor's Notes

  1. WaitHandle can also be used for unmanaged resources.