Hintergrundprozesse in Windows 8 Metro-Apps mit JavaScript

Milen KoychevWindows 8/10

Dieser Blogbeitrag beschreibt die Möglichkeiten der parallelen Programmierung für Windows 8 Metro Apps mit JavaScript durch den Einsatz von HTML5 Technologien. Durch Parallelität wird es beispielsweise möglich, im Hintergrund Daten zu berechnen, ohne dass die UI gebremst wird.

Der folgende Inhalt gilt für die Entwicklung von Metro Apps mit JavaScript.
in den Programmiersprachen C#, VB.NET und C++11 gehört die Nebenläufigkeit zu den Basisfunktionen.

Nebenläufigkeit in JavaScript

Das als ECMAScript zertifizierte JavaScript kennt nicht die aus anderen Programmiersprachen bekannte Nebenläufigkeit mittels Multithreading wie beispielsweise C#/.NET, Java oder C++11 (zuvor als Teil von boost). Dies kann eine Herausforderung darstellen, wenn z.B. Daten im Hintergrund berechnet werden sollen.

JavaScript bietet mit Ajax und dem XMLHttpRequest Objekt die Möglichkeit, asynchron Daten im Hintergrund nachzuladen. Die Parallelität ist jedoch auf genau den einen Anwendungsfall beschränkt und kann nicht dazu verwendet werden, im Hintergrund lokal Berechnungen durchzuführen.

Eine einfache Nachahmung von Nebenläufigkeit bietet JavaScript über Timer. Per Timer ist es möglich, zeitverzögert oder in Intervallen Code auszuführen.

In JavaScript gibt es zwei Arten einen Timer zu erstellen:

setTimeout(method, n)

Diese Methode bewirkt, dass in n Millisekunden die übergebene Methode method ein mal aufgerufen wird.

setInterval(method, n)

Durch setInterval hingegen, wird die übergebene Methode method alle n Millisekunden erneut aufgerufen.

Die Methode wird in beiden Fällen als String übergeben. Beispiel: setTimeout("doWork()", 1000)

 

HTML5 Web Worker

Über die zuvor beschriebenen Timer keine wirkliche Nebenläufigkeit erreicht werden, denn die Timer laufen in demselben Thread wie die UI.

Mit HTML5 gibt es eine nun eine weitere Möglichkeit Multi-Threading zu realisieren. "Web Worker" ermöglichen es, Hintergrundprozesse auszuführen.

 

Beispielcode Web Worker in Windows Metro Apps

Das folgende Beispiel besteht aus zwei JavaScript Dateien.

· Die default.js stellt den Hauptthread dar

· Den Hintergrundprozess repräsentiert die Datei thread.js.

 

default.js

// create the Web Worker
var worker = new Worker("thread.js");

// create and register the callback method
worker.onMessage = function(result) {
    // do Something with the result
}

// call onmessage in thread.js
worker.postMessage(param); // call onmessage in thread.js

 

thread.js

self.onMessage = function(param) {
    // do Something
    self.postMessage(result); // call onMessage in default.js
}

 

Erläuterung des Beispielcodes

In der default.js wird ein Worker erstellt. Im Konstruktor wird die JavaScript Datei angegeben, welche die Methoden des Threads enthält.

Die Kommunikation der beiden Threads wird über Events abgebildet. Hierzu muss in beiden Threads ein Eventlistener über die Methode "onmessage" registriert werden. Für das Senden einer Nachricht von einem Thread zum anderen wird die Methode "postMessage" verwendet. Wichtig ist hier, das die Methoden exakt so geschrieben sein müssen wie hier beschrieben, sonst funktioniert es nicht.

Die Nachricht wird in Form eines JSON Objektes übergeben, das bei Übergabe eines Strings dynamisch erstellt wird. Daher muss die Eigenschaft data abgerufen werden, um auf die übergebene Zeichenfolge zugreifen zu können (hier: param.data).

 

Restriktionen bei der Verwendung von Web Workern

-    Kein Zugriff auf das DOM aus einem Web Worker Prozess. Es ist also nicht möglich, auf die HTML Struktur zuzugreifen

-    Auf globale Variablen kann nicht zugegriffen werden

-    Zugriff auf bestimmte Objekte ist nicht möglich oder beschränkt. z. B. auf das window Objekt kann nicht zugegriffen werden

 

Zusammenfassung und Vergleich zu C#

Mit den HTML5 Web Workern erhält JavaScript die Möglichkeit, parallele Aufgabe im Hintergrund auszuführen.

C# als Programmiersprache für Metro Apps unter Windows 8  bietet hier weitaus mächtigere Möglichkeiten. In C# sind Threads Kernbestandteil der Sprache und bieten weitaus umfangreichere Möglichkeiten, Parallelität abzubilden.

Die Multi-Threading Fähigkeiten der Sprache C# werden in Zukunft sogar noch ausgebaut. In der neuen Version 5.0 die auf der BUILD präsentiert wurde ist asynchrone Programmierung eines der Hauptthemen.

Einen guten Überblick über die neuen async Fähigkeiten findet man in den Blog-Beiträgen von Eric Lippert. Außerdem ist der Beitrag "Asynchrony in C# 5, Part One" zu empfehlen. Weiterhin war eine interessante Präsentation von Anders Hejlsberg (dem Chefentwickler von C#) auf der BUILD zu sehen.