Rainer Stropek software architects gmbh. Parallel & Async in C#
|
|
|
- Jerome Hudson
- 10 years ago
- Views:
Transcription
1 Rainer Stropek software architects gmbh Parallel & Async in C#
2 Agenda Parallele und asynchrone Programmierung sind von einem Nischenthema zu einer wichtigen Herausforderung für jeden.net-entwickler geworden. Spätestens am Beispiel der Windows Runtime (WinRT), dem API für Windows Store Apps, sieht man, welche Bedeutung dem Thema beizumessen ist: In WinRT sind nahezu alle Funktionen, die etwas länger dauern könnten, asynchron. Dadurch werden die vorhandenen Ressourcen besser genutzt und das UI friert nie ein. Rainer Stropek beginnt in seinem Workshop mit Grundlagen über parallele und asynchrone Programmierung mit.net. Er zeigt TPL und PLINQ in Aktion. Darauf aufbauend geht er auf die neuen C#-Schlüsselwörter async und await ein. Design-Guidelines für moderne, Task-basierende APIs sind der Abschluss des Workshops. Sie erfahren, wie Task Cancellation, Progress Reporting etc. richtig gemacht werden. Rainer stellt zum Workshop ein Slidedeck zum Nachschlagen zur Verfügung, im Workshop selbst stehen aber praktische Beispiele (C#) im Vordergrund.
3 Introduction software architects gmbh Rainer Stropek Developer, Speaker, Trainer MVP for Windows Azure since
4 Functional Programming Concepts In C# A Short Recap
5 A short recap Lambda expressions in C# Anonymous delegates Func, Func<T> Action, Action<T> Concepts of functional programming in C# Use first-class functions to reduce duplication of code Application of functional programming in LINQ BTW This has been around since C# 2 and/or 3.x
6 public delegate int MathOperation(int x, int y); static void Main(string[] args) MathOperation delegateoperation = Add; // Anonymous delegate MathOperation anonymousdelegateoperation = delegate(int num1, int num2) return num1 + num2; ; // Func<T> Func<int, int, int> operationfunction = Add; // Simple lambda functions operationfunction = (x, y) => x + y; delegateoperation = (x, y) => x + y; public static int Add(int num1, int num2) return num1 + num2;
7 public delegate string[] GenerateDataOperation(int numberofelements); static void Main(string[] args) GenerateDataOperation generateoperation = NameGenerator; // Multi-line anonymous delegate GenerateDataOperation anonymousgenerateoperation = delegate(int numberofelements) var result = new string[numberofelements]; for (int i = 0; i < numberofelements; i++) result[i] = string.format("line_0", i); ; return result; // Multi-line lambda functions Func<int, string[]> generatorfunction = (numberofelements) => var result = new string[numberofelements]; for (int i = 0; i < numberofelements; i++) result[i] = string.format("line_0", n); ; return result;
8 Do we need some recap on LINQ? IEnumerable<T> Covariance C# LINQ syntax LINQ Support in.net Framework Lambda expressions as data IQueryable<T> Expression trees
9 // Result of a method var res5 = from training in demodata select training.attendees.first(); // Result of a property var res6 = from training in demodata select training.duration; // Anonymous type var res7 = from training in demodata select new training.title, NumberOfAttendees = training.attendees.count() ; Map part of the famous map/reduce concept Even if you do not like var, here you have to use it // Instance of existing type var res8 = from training in demodata select new TrainingInfo Title = training.title, NumberOfAttendees = training.attendees.count() ;
10 Query vs. Method Syntax Linq queries are a concept of the language, not the.net Framework Compiler converts query into method calls Pass first-class function as parameter to a LINQ method
11 public static void SelectManyDemo() var strings = new [] "This is string number one", "This might be a second string" ; Method Syntax var result = strings.selectmany(s => s.split(' ')).Distinct().Select(s => s.tolower()).orderby(s => s); foreach (var line in result) Console.WriteLine(line); Reduce Map
12 var res12 = from training in demodata group training by new training.title, NumberOfAttendees = training.attendees.count( a => a.countryoforigin == "AT") into traininggroup where traininggroup.key.numberofattendees > 0 select new traininggroup.key.title, AttendeesFromAustria = traininggroup.key.numberofattendees ; Method syntax embedded in LINQ query
13 Parallel Programming Task Parallel Library
14 Goals Understand Tasks foundation for async/await Take a close look at C# 4.5 s stars async/await
15 Recommended Reading Joseph Albahari, Threading in C# (from his O Reilly book C# 4.0 in a Nutshell) Patterns of Parallel Programming Task-based Asynchronous Pattern A technical introduction to the Async CTP Using Async for File Access Async Performance: Understanding the Costs of Async and Await (MSDN Magazine)
16 See also Patterns of Parallel Programming
17 Multithreading Pre.NET 4 System.Threading Namespace Thread Klasse ThreadPool Klasse.NET 4 System.Threading. Tasks Namespace Task und Task<TResult> Klassen TaskFactory Klasse Parallel Klasse
18 Kurzer Überblick über Tasks Starten Parallel.Invoke( ) Task.Factory.StartNew( ) Warten mytask.wait() Task.WaitAll Task.WaitAny Task.Factory.ContinueWhenAll( ) Task.Factory.ContinueWhenAny( ) Verknüpfen Task.Factory.StartNew(, TaskCreationOptions.AttachedToParent); Abbrechen Cancellation Tokens Nicht in Silverlight MSDN
19 Schleifen - Parallel.For var source = new double[program.size]; var destination = new double[program.size]; Console.WriteLine(MeasuringTools.Measure(() => for (int i = 0; i < Program.Size; i++) source[i] = (double)i; )); for (int i = 0; i < Program.Size; i++) destination[i] = Math.Pow(source[i], 2); Console.WriteLine(MeasuringTools.Measure(() => Parallel.For(0, Program.Size, (i) => source[i] = (double)i); Parallel.For(0, Program.Size, (i) => destination[i] = Math.Pow(source[i], 2)); ));
20 Schleifen - Parallel.For Unterstützung für Exception Handling Break und Stop Operationen Stop: Keine weiteren Iterationen Break: Keine Iterationen nach dem aktuellen Index mehr Siehe dazu auch ParallelLoopResult Int32 und Int64 Laufvariablen Konfigurationsmöglichkeiten (z.b. Anzahl an Threads) Schachtelbar Geteilte Threading-Ressourcen Effizientes Load Balancing U.v.m. Nicht selbst entwickeln!
21 Schleifen - Parallel.ForEach Console.WriteLine( "Serieller Durchlauf mit foreach: 0", MeasuringTools.Measure(() => double sumofsquares = 0; foreach (var square in Enumerable.Range(0, Program.Size).Select( i => Math.Pow(i, 2))) sumofsquares += square; )); Console.WriteLine( "Paralleler Durchlauf mit foreach: 0", MeasuringTools.Measure(() => double sumofsquares = 0; Parallel.ForEach(Enumerable.Range(0, Program.Size).Select(i => Math.Pow(i, 2)), square => sumofsquares += square); )); Hoher Aufwand für abgesicherten Zugriff auf MoveNext/Current Parallele Version oft langsamer
22 Von LINQ zu PLINQ LINQ var result = source.where( ).Select( ) PLINQ var result = source.asparallel().where( ).Select( ) Aus IEnumerable wird ParallelQuery Tipp: AsOrdered() erhält die Sortierreihenfolge
23 Performancetipps für PLINQ Allokieren von Speicher in parallelem Lambdaausdruck vermeiden Sonst kann Speicher + GC zum Engpass werden Wenn am Server: Server GC False Sharing vermeiden Bei zu kurzen Delegates ist Koordinationsaufwand für Parallelisierung oft höher als Performancegewinn Expensive Delegates Generell: Auf richtige Granularität der Delegates achten AsParallel() kann an jeder Stelle im LINQ Query stehen Teilweise serielle, teilweise parallele Ausführung möglich Über Environment.ProcessorCount kann Anzahl an Kernen ermittelt werden Messen, Messen, Messen!
24 Was läuft hier falsch? (Code) var result = new List<double>(); Console.WriteLine( "Paralleler Durchlauf mit Parallel.ForEach: 0", MeasuringTools.Measure(() => Parallel.ForEach( source.asparallel(), i => if (i % 2 == 0) lock (result) result.add(i); ); )); Parallel.ForEach verwendet IEnumerable<T> unnötige Merge-Schritte
25 Was läuft hier falsch? (Code) Console.WriteLine( "Paralleler Durchlauf mit Parallel.ForAll: 0", MeasuringTools.Measure(() => source.asparallel().forall( i => if (i % 2 == 0) lock (result) result.add(i); ); )); Lock-free Collection wäre überlegenswert!
26 Was läuft hier falsch? (Code) Console.WriteLine( "Serielles Lesen: 0", MeasuringTools.Measure(() => foreach (var url in urls) var request = WebRequest.Create(url); using (var response = request.getresponse()) )); Optimal für Parallelisierung selbst bei einem Core (IO-Bound Waits) using (var stream = response.getresponsestream()) var content = new byte[1024]; while (stream.read(content, 0, 1024)!= 0) ;
27 Was läuft hier falsch? (Code) Console.WriteLine( "Paralleles Lesen: 0", MeasuringTools.Measure(() => Parallel.ForEach(urls, url => var request = WebRequest.Create(url); using (var response = request.getresponse()) using (var stream = response.getresponsestream()) var content = new byte[1024]; while (stream.read(content, 0, 1024)!= 0) ; ); )); Anzahl Threads = Anzahl Cores; könnte mehr sein, da IO-Bound waits Parallel.ForEach( urls, new ParallelOptions() MaxDegreeOfParallelism = urls.length, url => );
28 Was läuft hier falsch? (Code) Console.WriteLine( "Paralleles Lesen: 0", MeasuringTools.Measure(() => urls.asparallel().withdegreeofparallelism(urls.length).select(url => WebRequest.Create(url)).Select(request => request.getresponse()).select(response => new Response = response, Stream = response.getresponsestream() ).ForAll(stream => var content = new byte[1024]; while (stream.stream.read(content, 0, 1024)!= 0) ; stream.stream.dispose(); stream.response.close(); ); )); OK für Client, tödlich für Server! Wenn Anzahl gleichzeitiger User wichtig ist sind andere Lösungen vorzuziehen.
29 private static void DoSomething() Action<Action> measure = (body) => var starttime = DateTime.Now; body(); Console.WriteLine("0 1", Thread.CurrentThread.ManagedThreadId, DateTime.Now - starttime); ; This process will run in parallel Action calcprocess = () => for (int i = 0; i < ; i++);; measure(() => Task.WaitAll(Enumerable.Range(0, 10).Select(i => Task.Run(() => measure(calcprocess))).toarray())); Note that we use the new Task.Run function here; previously you had to use Task.Factory.StartNew
30 Action<Action> measure = (body) => var starttime = DateTime.Now; body(); Console.WriteLine("0 1", Thread.CurrentThread.ManagedThreadId, DateTime.Now - starttime); ; Action calcprocess = () => for (int i = 0; i < ; i++);; Action ioprocess = () => Thread.Sleep(1000); ; Note that this task is not compute-bound // ThreadPool.SetMinThreads(5, 5); measure(() => Task.WaitAll(Enumerable.Range(0, 10).Select(i => Task.Run(() => measure(ioprocess))).toarray()); );
31 Action<Action> measure = (body) => var starttime = DateTime.Now; body(); Console.WriteLine("0 1", Thread.CurrentThread.ManagedThreadId, DateTime.Now - starttime); ; Action calcprocess = () => for (int i = 0; i < ; i++);; Action ioprocess = () => Thread.Sleep(1000); ; ThreadPool.SetMinThreads(5, 5); measure(() => Enumerable.Range(0, 10).AsParallel().WithDegreeOfParallelism(5).ForAll(i => measure(ioprocess)));
32 Excursus - PLINQ Use.AsParallel to execute LINQ query in parallel Be careful if you care about ordering Use.AsOrdered if necessary Use.WithDegreeOfParallelism in case of IO-bound tasks Use.WithCancellation to enable cancelling
33 private static void DoSomethingElse() Func<int, int> longrunningfunc = (prevresult) => Thread.Sleep(1000); return prevresult + 42; ; Concat tasks using ContinueWith var task = Task.Run(() => longrunningfunc(0)).continuewith(t => longrunningfunc(t.result)).continuewith(t => longrunningfunc(t.result)); task.wait(); Console.WriteLine(task.Result); Wait for completion of a task.
34 Exception Handling AggregateException Remove nested Aggregate Exceptions with Flatten Use CancellationToken for cooperative cancellation Use the Handle method instead of loop over Aggregate Exceptions Use Task.Exception
35 var task1 = Task.Factory.StartNew(() => throw new MyCustomException("I'm bad, but not too bad!"); ); try task1.wait(); catch (AggregateException ae) // Assume we know what's going on with this particular exception. // Rethrow anything else. AggregateException.Handle provides // another way to express this. See later example. foreach (var e in ae.innerexceptions) if (e is MyCustomException) Console.WriteLine(e.Message); else throw;
36 var task1 = Task.Factory.StartNew(() => var child1 = Task.Factory.StartNew(() => var child2 = Task.Factory.StartNew(() => throw new MyCustomException("Attached child2 faulted.");, TaskCreationOptions.AttachedToParent); ); // Uncomment this line to see the exception rethrown. // throw new MyCustomException("Attached child1 faulted.");, TaskCreationOptions.AttachedToParent); try task1.wait(); catch (AggregateException ae) foreach (var e in ae.flatten().innerexceptions) // or... // ae.flatten().handle((ex) => ex is MyCustomException);
37 var tokensource = new CancellationTokenSource(); var token = tokensource.token; var task1 = Task.Factory.StartNew(() => CancellationToken ct = token; while (somecondition) // Do some work... Thread.SpinWait(50000); ct.throwifcancellationrequested();, token); // No waiting required.
38 foreach (var e in ae.innerexceptions) if (e is MyCustomException) Console.WriteLine(e.Message); else throw; ae.handle((ex) => return ex is MyCustomException; );
39 var task1 = Task.Factory.StartNew(() => throw new MyCustomException("Task1 faulted."); ).ContinueWith((t) => Console.WriteLine("I have observed a 0", t.exception.innerexception.gettype().name);, TaskContinuationOptions.OnlyOnFaulted);
40 Thread Synchronisation Use C# lock statement to control access to shared variables Under the hoods Monitor.Enter and Monitor.Exit is used Quite fast, usually fast enough Only care for lock-free algorithms if really necessary Note that a thread can lock the same object in a nested fashion
41 // Source: C# 4.0 in a Nutshell, O Reilly Media class ThreadSafe static readonly object _locker = new object(); static int _val1, _val2; static void Go() lock (_locker) if (_val2!= 0) Console.WriteLine (_val1 / _val2); _val2 = 0; // This is what happens behind the scenes bool locktaken = false; try Monitor.Enter(_locker, ref locktaken); // Do your stuff... finally if (locktaken) Monitor.Exit(_locker);
42 // Provide a factory for instances of the Random class per thread var tlr = new ThreadLocal<Random>( () => new Random(Guid.NewGuid().GetHashCode())); var watch = Stopwatch.StartNew(); var tasks = // Run 10 tasks in parallel Enumerable.Range(0, 10).Select(_ => Task.Run(() => // Create a lot of randoms between 0 and 9 and calculate // the sum Enumerable.Range(0, ).Select( => tlr.value.next(10)).sum())).toarray(); Task.WaitAll(tasks); // Calculate the total Console.WriteLine(tasks.Aggregate<Task<int>, int>( 0, (agg, val) => agg + val.result)); Console.WriteLine(watch.Elapsed); watch = Stopwatch.StartNew(); Do you think this is a good solution?
43 // Provide a factory for instances of the Random class per thread var tlr = new ThreadLocal<Random>( () => new Random(Guid.NewGuid().GetHashCode())); var watch = Stopwatch.StartNew(); Console.WriteLine( ParallelEnumerable.Range(0, ).Select(_ => tlr.value.next(10)).sum()); Console.WriteLine(watch.Elapsed); Prefer PLINQ over TPL because it automatically breaks the workload into packages.
44 Alternatives For lock Mutex Semaphore(Slim) ReaderWriterLock(Slim) Not covered here in details
45 Thread Synchronization AutoResetEvent Unblocks a thread once when it receives a signal from another thread ManualResetEvent(Slim) Like a door, opens and closes again CountdownEvent New in.net 4 Unblocks if a certain number of signals have been received Barrier class New in.net 4 Not covered here Wait and Pulse Not covered here
46 Producer/Consumer Was läuft hier falsch? (Code) var buffer = new Queue<long>(); var canceltokensource = new CancellationTokenSource(); var done = false; var producer = Task.Factory.StartNew((cancelTokenObj) => var counter = ; var canceltoken = (CancellationToken)cancelTokenObj; try while (!canceltoken.iscancellationrequested && counter-- > 0) // Here we get some data (e.g. reading it from a file) var value = DateTime.Now.Ticks; // Write it to buffer with values that have to be processed buffer.enqueue(value); finally done = true; buffer wird nicht gelockt, canceltokensource.token);
47 Producer/Consumer Was läuft hier falsch? (Code) var consumer = Task.Factory.StartNew((cancelTokenObj) => var canceltoken = (CancellationToken)cancelTokenObj; while (!canceltoken.iscancellationrequested &&!done) // Get the next value to process lock (buffer) var value = buffer.dequeue(); // Here we do some expensive procesing Thread.SpinWait(1000);, canceltokensource.token); Prüfung ob leer fehlt Consumer ist viel langsamer als Producer Producer überschwemmt Consumer mit Daten
48 Collections für parallele Programmierung System.Collections.Concurrent für Thread- Safe Collections BlockingCollection<T> Blocking und Bounding-Funktionen ConcurrentDictionary<T> ConcurrentQueue<T> ConcurrentStack<T> ConcurrentBag<T> Optimal zur Umsetzung von Pipelines Datei wird gelesen, gepackt, verschlüsselt, geschrieben
49 Producer/Consumer Was läuft hier falsch? (Code) var buffer = new BlockingCollection<long>(10); var canceltokensource = new CancellationTokenSource(); var producer = Task.Factory.StartNew((cancelTokenObj) => var counter = ; var canceltoken = (CancellationToken)cancelTokenObj; try while (!canceltoken.iscancellationrequested && counter-- > 0) // Here we get some data (e.g. reading it from a file) var value = DateTime.Now.Ticks; // Write it to the buffer with values that have to be processed buffer.add(value); finally buffer.completeadding();, canceltokensource.token);
50 Producer/Consumer Was läuft hier falsch? (Code) var consumer = Task.Factory.StartNew((cancelTokenObj) => var canceltoken = (CancellationToken)cancelTokenObj; foreach (var value in buffer.getconsumingenumerable()) if ( canceltoken.iscancellationrequested ) break; // Here we do some expensive procesing Thread.SpinWait(1000);, canceltokensource.token);
51 Async Programming The big new thing in C# 5
52 private static void DownloadSomeTextSync() using (var client = new WebClient()) Console.WriteLine( client.downloadstring(new Uri(string.Format( " (Dns.GetHostAddresses(" Synchronous version of the code; would block UI thread
53 private static void DownloadSomeText() var finishedevent = new AutoResetEvent(false); // Notice the IAsyncResult-pattern here Dns.BeginGetHostAddresses(" GetHostEntryFinished, finishedevent); finishedevent.waitone(); private static void GetHostEntryFinished(IAsyncResult result) var hostentry = Dns.EndGetHostAddresses(result); using (var client = new WebClient()) // Notice the Event-based asynchronous pattern here client.downloadstringcompleted += (s, e) => Console.WriteLine(e.Result); ((AutoResetEvent)result.AsyncState).Set(); ; client.downloadstringasync(new Uri(string.Format( " hostentry[0].tostring()))); Notice that control flow is not clear any more.
54 private static void DownloadSomeText() var finishedevent = new AutoResetEvent(false); // Notice the IAsyncResult-pattern here Dns.BeginGetHostAddresses( " (result) => var hostentry = Dns.EndGetHostAddresses(result); using (var client = new WebClient()) // Notice the Event-based asynchronous pattern here client.downloadstringcompleted += (s, e) => Console.WriteLine(e.Result); ((AutoResetEvent)result.AsyncState).Set(); ; client.downloadstringasync(new Uri(string.Format( " hostentry[0].tostring())));, finishedevent); finishedevent.waitone(); Notice how lambda expression can make control flow clearer
55 Notice the use of the new Task Async Pattern APIs in.net 4.5 here private static void DownloadSomeTextUsingTask() Dns.GetHostAddressesAsync(" => using (var client = new WebClient()) return client.downloadstringtaskasync(new Uri(string.Format( " t.result[0].tostring()))); ).ContinueWith(t2 => Console.WriteLine(t2.Unwrap().Result)).Wait(); Notice the use of lambda expressions all over the methods Notice how code has become shorter and more readable
56 Rules For Async Method Signatures Method name ends with Async Return value Task if sync version has return type void Task<T> if sync version has return type T Avoid out and ref parameters Use e.g. Task<Tuple<T1, T2, >> instead
57 // Synchronous version private static void DownloadSomeTextSync() using (var client = new WebClient()) Console.WriteLine( client.downloadstring(new Uri(string.Format( " (Dns.GetHostAddresses(" Notice how similar the sync and async versions are! // Asynchronous version private static async void DownloadSomeTextUsingTaskAsync() using (var client = new WebClient()) Console.WriteLine( await client.downloadstringtaskasync(new Uri(string.Format( " (await Dns.GetHostAddressesAsync("
58 private static async void DownloadSomeTextUsingTaskAsync2() using (var client = new WebClient()) try var ipaddress = await Dns.GetHostAddressesAsync(" var content = await client.downloadstringtaskasync( new Uri(string.Format("htt://0", ipaddress[0]))); Console.WriteLine(content); catch (Exception) Console.WriteLine("Exception!"); Let s check the generated code and debug the async code
59 Guidelines for async/await If Task ended in Canceled state, OperationCanceledException will be thrown
60 private async static void CancelTask() try var cancelsource = new CancellationTokenSource(); var result = await DoSomethingCancelledAsync(cancelSource.Token); Console.WriteLine(result); catch (OperationCanceledException) Console.WriteLine("Cancelled!"); private static Task<int> DoSomethingCancelledAsync(CancellationToken token) // For demo purposes we ignore token and always return a cancelled task var result = new TaskCompletionSource<int>(); result.setcanceled(); return result.task; Note usage of TaskCompletionSource<T> here
61 Note that async API of WebClient uses existing cancellation logic instead of CancellationTokenSource
62
63 Guidelines for async/await Caller runs in parallel to awaited methods Async methods sometimes do not run async (e.g. if task is already completed when async is reached)
64 Guidelines for async/await (UI Layer) async/await use SynchronizationContext to execute the awaiting method UI thread in case of UI layer Use Task.ConfigureAwait to disable this behavior E.g. inside library to enhance performance
65 public partial class MainWindow : Window public MainWindow() this.datacontext = this; this.listboxcontent = new ObservableCollection<string>(); this.initializecomponent(); this.listboxcontent.add("started"); this.loaded += async (s, e) => for (int i = 0; i < 10; i++) ListBoxContent.Add(await Task.Run(() => Thread.Sleep(1000); return "Hello World!"; )); ; this.listboxcontent.add("finished"); public ObservableCollection<string> ListBoxContent get; private set;
66
67 Guidelines For Implementing Methods Ready For async/await Return Task/Task<T> Use postfix Async If method support cancelling, add parameter of type System.Threading.CancellationToken If method support progress reporting, add IProgress<T> parameter Only perform very limited work before returning to the caller (e.g. check arguments) Directly throw exception only in case of usage errors
68 public class Program : IProgress<int> static void Main(string[] args) var finished = new AutoResetEvent(false); PerformCalculation(finished); finished.waitone(); private static async void PerformCalculation(AutoResetEvent finished) Console.WriteLine(await CalculateValueAsync( 42, CancellationToken.None, new Program())); finished.set(); public void Report(int value) Console.WriteLine("Progress: 0", value);
69 private static Task<int> CalculateValueAsync( int startingvalue, CancellationToken cancellationtoken, IProgress<int> progress) if (startingvalue < 0) // Usage error throw new ArgumentOutOfRangeException("startingValue"); return Task.Run(() => int result = startingvalue; for (int outer = 0; outer < 10; outer++) cancellationtoken.throwifcancellationrequested(); // Do some calculation Thread.Sleep(500); result += 42; progress.report(outer + 1); ); return result; Note that this pattern is good for compute-bound jobs
70 private static async void PerformCalculation(AutoResetEvent finished) try var cts = new CancellationTokenSource(); Task.Run(() => Thread.Sleep(3000); cts.cancel(); ); var result = await CalculateValueAsync( 42, cts.token, new Program()); catch (OperationCanceledException) Console.WriteLine("Cancelled!"); finished.set(); Note cancellation and handling of OperationCanceledException.
71 private static Task<int> CalculateValueAsync( int startingvalue, CancellationToken cancellationtoken, IProgress<int> progress) if (startingvalue < 0) // By definition the result has to be 0 if startingvalue < 0 return Task.FromResult(0); return Task.Run(() => [ ] ); Note that you could use TaskCompletionSource instead Note how Task.FromResult is used to return a pseudo-task
72 Was läuft hier falsch? (Code) Console.WriteLine( "Paralleles Lesen mit TaskFactory: 0", MeasuringTools.Measure(() => var tasks = new Task[urls.Length]; for (int i = 0; i < urls.length; i++) tasks[i] = Task.Factory.StartNew(() => ReadUrl(urls[i])); )); Task.WaitAll(tasks); private static void ReadUrl(object url) Delegate verwendet Wert von i aus dem Main Thread IndexOutOfRangeException
73 Was läuft hier falsch? (Code) // Variante 1 Durch lokale Variable wird delegate var tasks = new Task[urls.Length]; unabhängig; mehr zum Thema unter dem for (int i = 0; i < urls.length; i++) Schlagwort Closures var tmp = i; tasks[i] = Task.Factory.StartNew(() => ReadUrl(urls[tmp])); // Variante 2 var tasks = new Task[urls.Length]; State object wird an delegate übergeben for (int i = 0; i < urls.length; i++) tasks[i] = Task.Factory.StartNew(ReadUrl, urls[i]);
74 for (var i = 0; i < 10; i++) new Thread(() => Console.Write(i)).Start(); for (var i = 0; i < 10; i++) var temp = i; new Thread(() => Console.Write(temp)).Start(); You have to be careful with closures and multi-threading.
75 // Setup timer using an action (notice the closure here) var starttime = DateTime.Now; using (var timer = new System.Threading.Timer( _ => progressindicator(datetime.now - starttime), null, 1000, 1000)) Thread.Sleep(3100);
76 F&A Danke für die Teilnahme!
77 is the leading time tracking solution for knowledge workers. Graphical time tracking calendar, automatic tracking of your work using signal trackers, high level of extensibility and customizability, full support to work offline, and SaaS deployment model make it the optimal choice especially in the IT consulting business. Try for free and without any risk. You can get your trial account at After the trial period you can use for only 0,20 per user and month without a minimal subscription time and without a minimal number of users.
78 ist die führende Projektzeiterfassung für Knowledge Worker. Grafischer Zeitbuchungskalender, automatische Tätigkeitsaufzeichnung über Signal Tracker, umfassende Erweiterbarkeit und Anpassbarkeit, volle Offlinefähigkeit und einfachste Verwendung durch SaaS machen es zur Optimalen Lösung auch speziell im IT-Umfeld. Probieren Sie kostenlos und ohne Risko einfach aus. Einen Testzugang erhalten Sie unter Danach nutzen Sie um nur 0,20 pro Benutzer und Tag ohne Mindestdauer und ohne Mindestbenutzeranzahl.
Rainer Stropek software architects gmbh. C# Powerworkshop
Rainer Stropek software architects gmbh C# Powerworkshop C# - Gegenwart und Zukunft Die fünfte Version von C# ist da. Zeit, sich intensiv damit auseinanderzusetzen und einen Blick in die Zukunft zu werfen.
Rainer Stropek software architects gmbh. Entwicklung modularer Anwendungen mit C# und dem Managed Extensibility Framework (MEF)
Rainer Stropek software architects gmbh Entwicklung modularer Anwendungen mit C# und dem Managed Extensibility Framework (MEF) Abstract (German) Größere Softwareprojekte werden heute üblicherweise in Teams
Search Engines Chapter 2 Architecture. 14.4.2011 Felix Naumann
Search Engines Chapter 2 Architecture 14.4.2011 Felix Naumann Overview 2 Basic Building Blocks Indexing Text Acquisition Text Transformation Index Creation Querying User Interaction Ranking Evaluation
Linux & Docker auf Azure
Linux & Docker auf Azure Linux in der Azure Cloud Web Mail Twitter Rainer Stropek software architects gmbh http://www.timecockpit.com [email protected] @rstropek Saves the day. Your Host Rainer Stropek
Dokumentation über die Übernahme von. "GS-R-3" (The Management System for Facilities and Activities) "Sicherheitskriterien für Kernkraftwerke"
Dokumentation über die Übernahme von "GS-R-3" () in die "Sicherheitskriterien für Kernkraftwerke" REVISION D APRIL 2009 1. INTRODUCTION BACKGROUND 1.1 This Safety Requirements publication defines the requirements
NATIVE ADVERTISING, CONTENT MARKETING & CO. AUFBRUCH IN EIN NEUES GOLDENES ZEITALTER DES MARKETINGS?
NATIVE ADVERTISING, CONTENT MARKETING & CO. AUFBRUCH IN EIN NEUES GOLDENES ZEITALTER DES MARKETINGS? 2014 in Frankfurt am Main DATUM 11.11.2014 SEITE 2 Christian Paul Stobbe Director Strategy Düsseldorf
C#5.0 IN A NUTSHELL. Joseph O'REILLY. Albahari and Ben Albahari. Fifth Edition. Tokyo. Sebastopol. Beijing. Cambridge. Koln.
Koln C#5.0 IN A NUTSHELL Fifth Edition Joseph Albahari and Ben Albahari O'REILLY Beijing Cambridge Farnham Sebastopol Tokyo Table of Contents Preface xi 1. Introducing C# and the.net Framework 1 Object
Semantic Web. Semantic Web: Resource Description Framework (RDF) cont. Resource Description Framework (RDF) W3C Definition:
Semantic Web: The Semantic Web is an extension of the current web in which information is given well-defined meaning, better enabling computers and people to work in cooperation. Tim Berners-Lee, James
Implementing Data Models and Reports with Microsoft SQL Server
Implementing Data Models and Reports with Microsoft SQL Server Dauer: 5 Tage Kursnummer: M20466 Überblick: Business Intelligence (BI) wird für Unternehmen von verschiedenen Größen aufgrund des dadurch
Digicomp Microsoft Evolution Day 2015 1. MIM 2016 Oliver Ryf. Partner:
1 MIM 2016 Oliver Ryf Partner: 2 Agenda Begrüssung Vorstellung Referent PowerShell Desired State Configuration F&A Weiterführende Kurse 3 Vorstellung Referent Seit 1991 IT-Trainer 1995 MCSE und MCT Seit
Open Text Social Media. Actual Status, Strategy and Roadmap
Open Text Social Media Actual Status, Strategy and Roadmap Lars Onasch (Product Marketing) Bernfried Howe (Product Management) Martin Schwanke (Global Service) February 23, 2010 Slide 1 Copyright Open
Kapitel 2 Unternehmensarchitektur III
Kapitel 2 Unternehmensarchitektur III Software Architecture, Quality, and Testing FS 2015 Prof. Dr. Jana Köhler [email protected] IT Strategie Entwicklung "Foundation for Execution" "Because experts
Communication Motivation
Communication Motivation Synchronization and Communication Interprocess Communcation (IPC) typically comprises synchronization as well as communication issues! Synchronization A waits until a specific
APPLICATION SETUP DOCUMENT
APPLICATION SETUP DOCUMENT HeiTek Software Development GmbH Add-Ons Oracle Application Change Layout in Receiving Personalisation Example Ref Prepared by HeiTek Software Development GmbH Author: : Georg
Testen mit Produktionsdaten Fluch oder Segen?
Testen mit Produktionsdaten Fluch oder Segen? Thomas Baumann Die Mobiliar ISACA After Hours Seminar Dienstag, 30.Oktober 2012 2 Agenda PART I: Copy from Production to Test Requirements Solutions and experiences
Diese Liste wird präsentiert von. Netheweb.de
Diese Liste wird präsentiert von Netheweb.de Die Liste enthält 1000 Do-Follow Blogs, die zum Linkbuilding genutzt werden können, es kann sein, dass verkürzte URL s nicht korrekt weiter geleitet werden.
Timebox Planning View der agile Ansatz für die visuelle Planung von System Engineering Projekt Portfolios
Agile Leadership Day 2015 Markus Giacomuzzi - Siemens Building Technologies Headquarters Zug Timebox Planning View der agile Ansatz für die visuelle Planung von System Engineering Projekt Portfolios structure
Upgrading Your Skills to MCSA Windows Server 2012 MOC 20417
Upgrading Your Skills to MCSA Windows Server 2012 MOC 20417 In dieser Schulung lernen Sie neue Features und Funktionalitäten in Windows Server 2012 in Bezug auf das Management, die Netzwerkinfrastruktur,
TIn 1: Lecture 3: Lernziele. Lecture 3 The Belly of the Architect. Basic internal components of the 8086. Pointers and data storage in memory
Mitglied der Zürcher Fachhochschule TIn 1: Lecture 3 The Belly of the Architect. Lecture 3: Lernziele Basic internal components of the 8086 Pointers and data storage in memory Architektur 8086 Besteht
Elena Chiocchetti & Natascia Ralli (EURAC) Tanja Wissik & Vesna Lušicky (University of Vienna)
Elena Chiocchetti & Natascia Ralli (EURAC) Tanja Wissik & Vesna Lušicky (University of Vienna) VII Conference on Legal Translation, Court Interpreting and Comparative Legilinguistics Poznań, 28-30.06.2013
How To Manage Build And Release With Tfs 2013
#dwx14 [email protected] #dwx14 Central Build and Release Management with TFS Thomas Rümmler AIT GmbH & Co. KG Christian Schlag AIT GmbH & Co. KG 1 2 OUR DAILY MOTIVATION It s hard enough for
SPICE auf der Überholspur. Vergleich von ISO (TR) 15504 und Automotive SPICE
SPICE auf der Überholspur Vergleich von ISO (TR) 15504 und Automotive SPICE Historie Software Process Improvement and Capability determination 1994 1995 ISO 15504 Draft SPICE wird als Projekt der ISO zur
Thomas Rümmler AIT GmbH & Co. KG Christian Schlag AIT GmbH & Co. KG. Central Build and Release Management with TFS
Thomas Rümmler AIT GmbH & Co. KG Christian Schlag AIT GmbH & Co. KG Central Build and Release Management with TFS 2 OUR DAILY MOTIVATION It s hard enough for software developers to write code that works
Central Release and Build Management with TFS. Christian Schlag
Central Release and Build Management with TFS Christian Schlag OUR DAILY MOTIVATION It s hard enough for software developers to write code that works on their machine. But even when it s done, there s
GTask Developing asynchronous applications for multi-core efficiency
GTask Developing asynchronous applications for multi-core efficiency February 2009 SCALE 7x Los Angeles Christian Hergert What Is It? GTask is a mini framework to help you write asynchronous code. Dependencies
Ein Leben ohne Dropbox, ist möglich und sinnvoll. Novell, Inc. All rights reserved.
Ein Leben ohne Dropbox, ist möglich und sinnvoll. Harald Gemmer 1 Carpe diem Mobile Life 2 Mehr iphones sind verkauft als jeden Tag Babies geboren werden über 110 verschiedene Android Devices 81% nutzen
IAC-BOX Network Integration. IAC-BOX Network Integration IACBOX.COM. Version 2.0.1 English 24.07.2014
IAC-BOX Network Integration Version 2.0.1 English 24.07.2014 In this HOWTO the basic network infrastructure of the IAC-BOX is described. IAC-BOX Network Integration TITLE Contents Contents... 1 1. Hints...
Mit einem Auge auf den mathema/schen Horizont: Was der Lehrer braucht für die Zukun= seiner Schüler
Mit einem Auge auf den mathema/schen Horizont: Was der Lehrer braucht für die Zukun= seiner Schüler Deborah Löwenberg Ball und Hyman Bass University of Michigan U.S.A. 43. Jahrestagung für DidakEk der
1Copyright 2013, Oracle and/or its affiliates. All rights reserved.
1Copyright 2013, Oracle and/or its affiliates. All rights reserved. The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated
SQL 2014 CTP1. Hekaton & CSI Version 2 unter der Lupe. Sascha Götz Karlsruhe, 03. Dezember 2013
Hekaton & CSI Version 2 unter der Lupe Sascha Götz Karlsruhe, 03. Dezember 2013 Most of today s database managers are built on the assumption that data lives on a disk, with little bits of data at a time
Upgrade-Preisliste. Upgrade Price List
Upgrade-Preisliste Mit Firmware Features With list of firmware features Stand/As at: 10.09.2014 Änderungen und Irrtümer vorbehalten. This document is subject to changes. copyright: 2014 by NovaTec Kommunikationstechnik
Software / FileMaker / Plug-Ins Mailit 6 for FileMaker 10-13
Software / FileMaker / Plug-Ins Mailit 6 for FileMaker 10-13 Seite 1 / 5 Mailit 6 for FileMaker 10-13 The Ultimate Email Plug-In Integrate full email capability into your FileMaker 10-13 solutions with
www.infoplc.net Application example AC500 Scalable PLC for Individual Automation Communication between AC500 and KNX network abb
Application example www.infoplc.net AC500 Scalable PLC for Individual Automation Communication between AC500 and KNX network abb Content www.infoplc.net 1 Disclaimer...2 1.1 For customers domiciled outside
EMC Greenplum. Big Data meets Big Integration. Wolfgang Disselhoff Sr. Technology Architect, Greenplum. André Münger Sr. Account Manager, Greenplum
EMC Greenplum Big Data meets Big Integration Wolfgang Disselhoff Sr. Technology Architect, Greenplum André Münger Sr. Account Manager, Greenplum 1 2 GREENPLUM DATABASE Industry-Leading Massively Parallel
FRAUNHOFER INSTITUTe For MATERIAL FLow and LOGISTIcs IML MARKETSTUDY: aided by:
FRAUNHOFER INSTITUTe For MATERIAL FLow and LOGISTIcs IML MARKETSTUDY:»Cloud Computing for LogistiCS«ACCEPTANCE OF THE LOGISTICS MALL by the users aided by: Innovation cluster «Logistics Mall Cloud Computing
FOR TEACHERS ONLY The University of the State of New York
FOR TEACHERS ONLY The University of the State of New York REGENTS HIGH SCHOOL EXAMINATION G COMPREHENSIVE EXAMINATION IN GERMAN Friday, June 15, 2007 1:15 to 4:15 p.m., only SCORING KEY Updated information
Designing and Implementing a Server Infrastructure MOC 20413
Designing and Implementing a Server Infrastructure MOC 20413 In dieser 5-tägigen Schulung erhalten Sie die Kenntnisse, welche benötigt werden, um eine physische und logische Windows Server 2012 Active
J2EE-Application Server
J2EE-Application Server (inkl windows-8) Installation-Guide F:\_Daten\Hochschule Zurich\Web-Technologie\ApplicationServerSetUp.docx Last Update: 19.3.2014, Walter Rothlin Seite 1 Table of Contents Java
SPECTRUM IM. SSA 3.0: Service AND Event/Alert Umbrella DACHSUG 2011
SPECTRUM IM Infrastructure Events and Alerts Overview Event Management and Correlation Event Rules Condition Correlation Event Procedures Event Integration South-Bound-GW Event Notifications SSA 3.0: Service
Softwareprojekt: Mobile Development Einführung Objective-C. Miao Wang, Tinosch Ganjineh Freie Universität Berlin, Institut für Informatik
Softwareprojekt: Mobile Development Einführung Objective-C Miao Wang, Tinosch Ganjineh Freie Universität Berlin, Institut für Informatik 21.04.2010 Agenda Organisatorisches Objective-C Basics (*) Cocoa
09336863931 : provid.ir
provid.ir 09336863931 : NET Architecture Core CSharp o Variable o Variable Scope o Type Inference o Namespaces o Preprocessor Directives Statements and Flow of Execution o If Statement o Switch Statement
Microsoft Nano Server «Tuva» Rinon Belegu
1 Microsoft Nano Server «Tuva» Rinon Belegu Partner: 2 Agenda Begrüssung Vorstellung Referent Content F&A Weiterführende Kurse 3 Vorstellung Referent Rinon Belegu Microsoft Certified Trainer (AWS Technical
Information Systems 2
Information Systems 2 Prof. Dr. Dr. L. Schmidt-Thieme MSc. André Busche Übung 9 0. Allerlei 1. Übung 2. Hands on some things 2.1 Saxon 2.2 Corba 28.06.10 2/ 0. Allerlei 1. Übung 2. Hands on some things
BP1 Mobile App Management: Solutions for ios and Android. Gary Barton Mobility Architect Citrix Receivers and Gateways Group
BP1 Mobile App Management: Solutions for ios and Android Gary Barton Mobility Architect Citrix Receivers and Gateways Group Agenda 1. Synergy Announcements 2. Mobile Management Market 3. Citrix Vision
Till Vollmer Geschäftsführer MindMeister
Till Vollmer Geschäftsführer MindMeister Was ist Google Gears? Browser Plugin Lokale Datenbank Lokaler Store (urls) Tools Klassen JavaScript Library Aktuelle Version (1.6.08 : V 0.3.X) Plugin für? Windows
A: Ein ganz normaler Prozess B: Best Practices in BPMN 1.x. ITAB / IT Architekturbüro Rüdiger Molle März 2009
A: Ein ganz normaler Prozess B: Best Practices in BPMN 1.x ITAB / IT Architekturbüro Rüdiger Molle März 2009 März 2009 I T A B 2 Lessons learned Beschreibung eines GP durch das Business läßt Fragen der
AD2 - The future of mobile enterprise applications: Live from the Citrix Labs
AD2 - The future of mobile enterprise applications: Live from the Citrix Labs Steve Parry, Senior Director, Citrix Labs Christian Gehring, Enterprise Presales Architect, Citrix Systems Citrix Labs Citrix
Embedded Software Development and Test in 2011 using a mini- HIL approach
Primoz Alic, isystem, Slovenia Erol Simsek, isystem, Munich Embedded Software Development and Test in 2011 using a mini- HIL approach Kurzfassung Dieser Artikel beschreibt den grundsätzlichen Aufbau des
Pro.NET 4 Parallel Programming in C#
CYAN MAGENTA YELLOW BLACK PANTONE 123 C BOOKS FOR PROFESSIONALS BY PROFESSIONALS Pro.NET 4 Parallel Programming in C# Dear Reader, Pro ASP.NET 4 in C# 2010 Pro LINQ: Language Integrated Query in C# 2010
PBS CBW NLS IQ Enterprise Content Store
CBW NLS IQ Enterprise Content Store Solution for NetWeaver BW and on HANA Information Lifecycle Management in BW Content Information Lifecycle Management in BW...3 Strategic Partnership...4 Information
SOFTWARE-DEFINED STORAGE IN ACTION. What s new in SANsymphony-V v10
SOFTWARE-DEFINED STORAGE IN ACTION What s new in SANsymphony-V v10 Andre Lahrmann Copyright 2014 DataCore Software Corp. All Rights Reserved. Copyright 2014 DataCore Software Corp. All Rights Reserved.
Microsoft Certified IT Professional (MCITP) MCTS: Windows 7, Configuration (070-680)
Microsoft Office Specialist Office 2010 Specialist Expert Master Eines dieser Examen/One of these exams: Eines dieser Examen/One of these exams: Pflichtexamen/Compulsory exam: Word Core (Exam 077-881)
First Environmental Comparison of Rail Transport
First Environmental Comparison of Rail Transport A projectof the Alianz pro Schiene Co-funded by the Federal Ministry for Environment, Nature Conservation and Nuclear Safety (BMU) in co-operation with
Die SharePoint-Welt für den erfahrenen.net- Entwickler. Fabian Moritz MVP Office SharePoint Server
Die SharePoint-Welt für den erfahrenen.net- Entwickler Fabian Moritz MVP Office SharePoint Server 1 SharePoint Object Model IFilter Webpart Connections Webparts Web Server Controls Custom Field Types Web
How To Create A Model In Ruby 2.5.2.2 (Orm)
Gastvortrag Datenbanksysteme: Nils Haldenwang, B.Sc. 1 Institut für Informatik AG Medieninformatik Models mit ActiveRecord 2 Model: ORM pluralisierter snake_case Tabelle: users Klasse: User id first_name
AnyWeb AG 2008 www.anyweb.ch
HP SiteScope (End-to-End Monitoring, System Availability) Christof Madöry AnyWeb AG ITSM Practice Circle September 2008 Agenda Management Technology Agentless monitoring SiteScope in HP BTO SiteScope look
QAS DEBUG - User und Computer
QAS DEBUG - User und Computer Inhalt Computer Status vastool status Benutzer Login vastool list user vastool nss getpwnam vastool user checkaccess kinit su
Stefan Engelberg (IDS Mannheim), Workshop Corpora in Lexical Research, Bucharest, Nov. 2008 [Folie 1]
Content 1. Empirical linguistics 2. Text corpora and corpus linguistics 3. Concordances 4. Application I: The German progressive 5. Part-of-speech tagging 6. Fequency analysis 7. Application II: Compounds
GETTING FEEDBACK REALLY FAST WITH DESIGN THINKING AND AGILE SOFTWARE ENGINEERING
GETTING FEEDBACK REALLY FAST WITH DESIGN THINKING AND AGILE SOFTWARE ENGINEERING Dr. Tobias Hildenbrand & Christian Suessenbach, SAP AG Entwicklertag Karlsruhe, 22 May 2014 Ich wollte Mitarbeiter so motivieren,
Building an Architecture Model 1. 1. Entwerfen Sie mit AxiomSys ein Kontextdiagramm, das folgendermaßen aussieht:
Building an Architecture Model 1 1. Entwerfen Sie mit AxiomSys ein Kontextdiagramm, das folgendermaßen aussieht: Wie Ihnen aus der vergangenen Lehrveranstaltung bekannt ist, bedeuten Sterne neben den Bezeichnungen,
StarterKit Embedded Control SC13 + DK51. From the electronic to the automation
SC13 + DK51 From the electronic to the automation 20.07.2005 No. 1 /14 Development board for Embedded Controller Open for add on of customer applications Ethernet-interface Serielle interface Compact flash
MUK-IT 63. Roundtable. Herzlich Willkommen bei der Software AG. Anton Hofmeier VP Sales Terracotta DACH / MdGL
MUK-IT 63. Roundtable Herzlich Willkommen bei der Software AG Anton Hofmeier VP Sales Terracotta DACH / MdGL Überblick February 15, 2013 2 Software AG www.softwareag.com 5.500 Mitarbeiter >1Mrd Umsatz
Über die Semantik von Modellierungssprachen
Über die Semantik von Modellierungssprachen und des UML-Standards Prof. Dr. Bernhard Rumpe Technische Universität Braunschweig http://www.sse.cs.tu-bs.de/ Seite 2 What is a model? And why do we need modeling
DV4 - Citrix CloudGateway: Access and control Windows, SaaS and web applications. Systems Engineer, Citrix Systems GmbH
DV4 - Citrix CloudGateway: Access and control Windows, SaaS and web applications Rob Sanders Oliver Lomberg Systems Engineer, Citrix Systems Systems Engineer, Citrix Systems GmbH Corporate PC Corporate
First Java Programs. V. Paúl Pauca. CSC 111D Fall, 2015. Department of Computer Science Wake Forest University. Introduction to Computer Science
First Java Programs V. Paúl Pauca Department of Computer Science Wake Forest University CSC 111D Fall, 2015 Hello World revisited / 8/23/15 The f i r s t o b l i g a t o r y Java program @author Paul Pauca
Citrix NetScaler Best Practices. Claudio Mascaro Senior Systems Engineer BCD-Sintrag AG
Citrix NetScaler Best Practices Claudio Mascaro Senior Systems Engineer BCD-Sintrag AG Agenda Deployment Initial Konfiguration Load Balancing NS Wizards, Unified GW, AAA Feature SSL 2 FTP SQL NetScaler
(51) Int Cl.: G10L 15/26 (2006.01)
(19) TEPZZ Z 8B_T (11) EP 2 023 338 B1 (12) EUROPEAN PATENT SPECIFICATION (4) Date of publication and mention of the grant of the patent: 28.0.14 Bulletin 14/22 (1) Int Cl.: GL /26 (06.01) (21) Application
AJAX SSL- Wizard Reference
AJAX SSL- Wizard Reference Version 1.0.2+ - 04.04.2011 Preamble This document explains the AJAX based SSL- Wizard developed by CertCenter AG. The seemless integration of the SSL- Wzard into the partner
Getting Started with the Internet Communications Engine
Getting Started with the Internet Communications Engine David Vriezen April 7, 2014 Contents 1 Introduction 2 2 About Ice 2 2.1 Proxies................................. 2 3 Setting Up ICE 2 4 Slices 2
Update to V10. Automic Support: Best Practices Josef Scharl. Please ask your questions here http://innovate.automic.com/q&a Event code 6262
Update to V10 Automic Support: Best Practices Josef Scharl Please ask your questions here http://innovate.automic.com/q&a Event code 6262 Agenda Update to Automation Engine Version 10 Innovations in Version
Joseph Beuys. Selection of 30 prints from three large suites Suite Schwurhand (1980) Suite Zirkulationszeit (1982) Suite Tränen (1985)
Selection of 30 prints from three large suites Suite Schwurhand (1980) Suite Zirkulationszeit () Suite Tränen (1985) etchings and lithographs on paper from 1980 until 1985 varying sizes each with handwritten
VMware Mirage Centralized Desktop Management with local Execution
VMware Mirage Centralized Desktop Management with local Execution Daniele Palazzo Head of IT Leiter Consulting Team & Beat Utzinger Senior Virtualization Architect 08:30 08:40 Begrüssung Einleitung W.
Rainer Stropek time cockpit. NuGet
Rainer Stropek time cockpit NuGet NuGet Package Manager für die Microsoft-Entwicklungsplattform Was ist NuGet? Werkzeug zur einfachen Verteilung von Paketen (=Libraries und Tools) Alles Notwendige in einem
Marc Grote. OCSP / CRL Schlüssel Archivierung CA-Konsole Certutil PKI Health
IT-Symposium 2008 04.06.2008 Marc Grote www.it-symposium2008.de 1 Bestandteile einer PKI CA-Hierarchien Windows 2008 PKI CA-Arten Funktionen Zertifikatvorlagen OCSP / CRL Schlüssel Archivierung CA-Konsole
Microsoft SQL Server 2008 R2 Reporting Services - Das Praxisbuch [ebook Kindle] PDF,
Microsoft SQL Server 2008 R2 Reporting Services - Das Praxisbuch [ebook Kindle] Download: Microsoft SQL Server 2008 R2 Reporting Services - Das Praxisbuch [ebook Kindle] PDF ebook Microsoft SQL Server
Vergleich der Versionen von Kapitel 1 des EU-GMP-Leitfaden (Oktober 2012) 01 July 2008 18 November 2009 31 Januar 2013 Kommentar Maas & Peither
Chapter 1 Quality Management Chapter 1 Quality Management System Chapter 1 Pharmaceutical Quality System Principle The holder of a Manufacturing Authorisation must manufacture medicinal products so as
Crash Course in Java
Crash Course in Java Based on notes from D. Hollinger Based in part on notes from J.J. Johns also: Java in a Nutshell Java Network Programming and Distributed Computing Netprog 2002 Java Intro 1 What is
GCE EXAMINERS' REPORTS. GERMAN AS/Advanced
GCE EXAMINERS' REPORTS GERMAN AS/Advanced JANUARY 2012 Statistical Information This booklet contains summary details for each unit: number entered; maximum mark available; mean mark achieved; grade ranges.
MySQL Cluster: HA als StorageEngine
MySQL Cluster: HA als StorageEngine Erkan Yanar linsenraum.de 25. April 2012 Erkan Yanar (linsenraum.de) MySQL Cluster: HA als StorageEngine 25. April 2012 1 / 34 What About Hochverfügbarkeit mit MySQL
Async startup WPF Application
Async startup WPF Application Friday, December 18, 2015 5:39 PM This document is from following the article here: https://msdn.microsoft.com/enus/magazine/mt620013.aspx While working through the examples
Created by Johannes Hoppe. Security
Created by Johannes Hoppe Security Ziel Angriffsvektoren aufzeigen. Strategien besprechen. Mehr nicht! Features Neue Angriffsvektoren Ein Formular Username: Password: Login
BASTA Workshop. Re-Imagine C#
BASTA Workshop Re-Imagine C# Inhalt Im Zentrum dieses erfolgreichen Klassikers unter den BASTA!-Workshops stehen diesmal die Themen Anwendungsmodularisierung und asynchrones Programmieren. Am Vormittag
Servermigrationen zu Hyper-V / Azure mit Double-Take Move
Servermigrationen zu Hyper-V / Azure mit Double-Take Move Agenda Über Vision Solutions Double-Take Move Live Demos Lizenzierung Über Vision Solutions HQ in Irvine, Kalifornien 25+ Jahre Erfahrung im HA/DR
CobraNet TM User s Manual
CobraNet TM User s Manual 19201 Cook Street, Foothill Ranch, CA 92610-3501 USA Phone: (949) 588-9997 Fax: (949) 588-9514 Email: [email protected] Web: www.renkus-heinz.com CobraNet TM is a registered
