Rash thoughts about .NET, C#, F# and Dynamics NAV.


"Every solution will only lead to new problems."

Saturday, 4. November 2006


Eine überwachte Kopierfabrik (4)

Filed under: C#,Tools — Steffen Forkmann at 11:00 Uhr

Im vierten Teil meiner kleinen Serie zur überwachten Kopierfabrik, soll es nun darum gehen den Kopiervorgang in einen anderen Thread auszulagern. Das Problem ist nämlich, dass der lang anhaltende Kopiervorgang sonst das Erkennen weiterer Dateisystem-Ereignisse verhindert und der Dienst für die Zeit des Kopierens “eingefroren” ist. Um nun den Kopiervorgang “parallel” zu starten, kann man in C# 2.0 den sogenannten BackgroundWorker benutzen. Dieser bietet auf ganz einfache Weise die Möglichkeit ein lang andauernden Vorgang in einen Hintergrundthread zu verlagern und über Events sogar Fortschrittsmeldungen nach Außen zu geben. Im speziellen Fall des Kopierens könnte man also einfach von BackgroundWorker ableiten:

using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; using System.IO; using System.Diagnostics; namespace DBCopyService { /// <summary> /// This BackgroundWorker copies the file async /// from source to target /// </summary> public class BackgroundCopyWorker : BackgroundWorker { private string sourceFile; private string targetFile; public BackgroundCopyWorker (string sourceFile, string targetFile) : base() { this.sourceFile = sourceFile; this.targetFile = targetFile; DoWork += new DoWorkEventHandler(bcw_DoWork); RunWorkerCompleted += new RunWorkerCompletedEventHandler (bcw_RunWorkerCompleted); RunWorkerAsync(); // Start new Thread } void bcw_RunWorkerCompleted( object sender, RunWorkerCompletedEventArgs e) { Trace.WriteLine(string.Format("{0} copied to {1}", sourceFile, targetFileName)); } void bcw_DoWork(object sender, DoWorkEventArgs e) { try { Trace.WriteLine(string.Format("Copy {0} to {1}", sourceFile, targetFile)); FileInfo SourceFile = new FileInfo(sourceFile); FileInfo TargetFile = new FileInfo(targetFile); SourceFile.CopyTo(TargetFile.FullName, true); } catch (Exception ex) { Trace.TraceError(ex.Message); } } } }

Das Starten eines asyncronen Kopiervorgangs erfolgt dann ganz einfach über:

new BackgroundCopyWorker(originalFileName, targetFileName);

No Comments »

No comments yet.

RSS feed for comments on this post. | TrackBack URI

Leave a comment

XHTML ( You can use these tags): <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> .