{"id":158,"date":"2006-11-04T11:00:42","date_gmt":"2006-11-04T10:00:42","guid":{"rendered":"http:\/\/www.navision-blog.de\/2006\/11\/04\/eine-berwachte-kopierfabrik-4\/"},"modified":"2006-11-04T11:24:56","modified_gmt":"2006-11-04T10:24:56","slug":"eine-berwachte-kopierfabrik-4","status":"publish","type":"post","link":"http:\/\/www.navision-blog.de\/blog\/2006\/11\/04\/eine-berwachte-kopierfabrik-4\/","title":{"rendered":"Eine &uuml;berwachte Kopierfabrik (4)"},"content":{"rendered":"<p>Im vierten Teil meiner kleinen Serie zur &#252;berwachten Kopierfabrik, soll es nun darum gehen den Kopiervorgang in einen anderen Thread auszulagern. Das Problem ist n&#228;mlich, dass der lang anhaltende Kopiervorgang sonst das&nbsp;Erkennen weiterer Dateisystem-Ereignisse verhindert und der Dienst f&#252;r die Zeit des Kopierens &#8220;eingefroren&#8221; ist. Um nun den Kopiervorgang&nbsp;&#8220;parallel&#8221; zu starten, kann man in C# 2.0 den sogenannten BackgroundWorker benutzen. Dieser bietet auf ganz einfache Weise die M&#246;glichkeit ein lang andauernden Vorgang in einen Hintergrundthread&nbsp;zu verlagern und &#252;ber Events sogar Fortschrittsmeldungen nach Au&#223;en zu geben. Im speziellen Fall des Kopierens k&#246;nnte man also einfach von BackgroundWorker ableiten:<\/p>\n<div class=\"wlWriterSmartContent\" id=\"57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:3c4718b1-e246-411c-86c4-584efc899eee\" contenteditable=\"false\" style=\"padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px\">\n<pre style=\"background-color:White;\"><div><!--\r\n\r\nCode highlighting produced by Actipro CodeHighlighter (freeware)\r\nhttp:\/\/www.CodeHighlighter.com\/\r\n\r\n--><span style=\"color: #0000FF; \">using<\/span><span style=\"color: #000000; \"> System;\r\n<\/span><span style=\"color: #0000FF; \">using<\/span><span style=\"color: #000000; \"> System.Collections.Generic;\r\n<\/span><span style=\"color: #0000FF; \">using<\/span><span style=\"color: #000000; \"> System.Text;\r\n<\/span><span style=\"color: #0000FF; \">using<\/span><span style=\"color: #000000; \"> System.ComponentModel;\r\n<\/span><span style=\"color: #0000FF; \">using<\/span><span style=\"color: #000000; \"> System.IO;\r\n<\/span><span style=\"color: #0000FF; \">using<\/span><span style=\"color: #000000; \"> System.Diagnostics;\r\n\r\n<\/span><span style=\"color: #0000FF; \">namespace<\/span><span style=\"color: #000000; \"> DBCopyService\r\n{\r\n    <\/span><span style=\"color: #808080; \">\/\/\/<\/span><span style=\"color: #008000; \"> <\/span><span style=\"color: #808080; \">&lt;summary&gt;<\/span><span style=\"color: #008000; \">\r\n    <\/span><span style=\"color: #808080; \">\/\/\/<\/span><span style=\"color: #008000; \"> This BackgroundWorker copies the file async \r\n    <\/span><span style=\"color: #808080; \">\/\/\/<\/span><span style=\"color: #008000; \"> from source to target\r\n    <\/span><span style=\"color: #808080; \">\/\/\/<\/span><span style=\"color: #008000; \"> <\/span><span style=\"color: #808080; \">&lt;\/summary&gt;<\/span><span style=\"color: #808080; \">\r\n<\/span><span style=\"color: #000000; \">    <\/span><span style=\"color: #0000FF; \">public<\/span><span style=\"color: #000000; \"> <\/span><span style=\"color: #0000FF; \">class<\/span><span style=\"color: #000000; \"> BackgroundCopyWorker : BackgroundWorker\r\n    {\r\n        <\/span><span style=\"color: #0000FF; \">private<\/span><span style=\"color: #000000; \"> <\/span><span style=\"color: #0000FF; \">string<\/span><span style=\"color: #000000; \"> sourceFile;\r\n        <\/span><span style=\"color: #0000FF; \">private<\/span><span style=\"color: #000000; \"> <\/span><span style=\"color: #0000FF; \">string<\/span><span style=\"color: #000000; \"> targetFile;\r\n\r\n        <\/span><span style=\"color: #0000FF; \">public<\/span><span style=\"color: #000000; \"> BackgroundCopyWorker\r\n          (<\/span><span style=\"color: #0000FF; \">string<\/span><span style=\"color: #000000; \"> sourceFile, <\/span><span style=\"color: #0000FF; \">string<\/span><span style=\"color: #000000; \"> targetFile) : <\/span><span style=\"color: #0000FF; \">base<\/span><span style=\"color: #000000; \">()\r\n        {\r\n            <\/span><span style=\"color: #0000FF; \">this<\/span><span style=\"color: #000000; \">.sourceFile <\/span><span style=\"color: #000000; \">=<\/span><span style=\"color: #000000; \"> sourceFile;\r\n            <\/span><span style=\"color: #0000FF; \">this<\/span><span style=\"color: #000000; \">.targetFile <\/span><span style=\"color: #000000; \">=<\/span><span style=\"color: #000000; \"> targetFile;\r\n            DoWork <\/span><span style=\"color: #000000; \">+=<\/span><span style=\"color: #000000; \"> <\/span><span style=\"color: #0000FF; \">new<\/span><span style=\"color: #000000; \"> DoWorkEventHandler(bcw_DoWork);\r\n            RunWorkerCompleted <\/span><span style=\"color: #000000; \">+=<\/span><span style=\"color: #000000; \"> \r\n               <\/span><span style=\"color: #0000FF; \">new<\/span><span style=\"color: #000000; \"> RunWorkerCompletedEventHandler                \r\n                 (bcw_RunWorkerCompleted);\r\n            RunWorkerAsync();  <\/span><span style=\"color: #008000; \">\/\/<\/span><span style=\"color: #008000; \"> Start new Thread<\/span><span style=\"color: #008000; \">\r\n<\/span><span style=\"color: #000000; \">        }\r\n\r\n        <\/span><span style=\"color: #0000FF; \">void<\/span><span style=\"color: #000000; \"> bcw_RunWorkerCompleted(\r\n          <\/span><span style=\"color: #0000FF; \">object<\/span><span style=\"color: #000000; \"> sender, RunWorkerCompletedEventArgs e)\r\n        {\r\n            Trace.WriteLine(<\/span><span style=\"color: #0000FF; \">string<\/span><span style=\"color: #000000; \">.Format(<\/span><span style=\"color: #000000; \">&quot;<\/span><span style=\"color: #000000; \">{0} copied to {1}<\/span><span style=\"color: #000000; \">&quot;<\/span><span style=\"color: #000000; \">, \r\n               sourceFile, targetFileName));\r\n        }\r\n\r\n        <\/span><span style=\"color: #0000FF; \">void<\/span><span style=\"color: #000000; \"> bcw_DoWork(<\/span><span style=\"color: #0000FF; \">object<\/span><span style=\"color: #000000; \"> sender, DoWorkEventArgs e)\r\n        {\r\n            <\/span><span style=\"color: #0000FF; \">try<\/span><span style=\"color: #000000; \">\r\n            {\r\n                Trace.WriteLine(<\/span><span style=\"color: #0000FF; \">string<\/span><span style=\"color: #000000; \">.Format(<\/span><span style=\"color: #000000; \">&quot;<\/span><span style=\"color: #000000; \">Copy {0} to {1}<\/span><span style=\"color: #000000; \">&quot;<\/span><span style=\"color: #000000; \">, \r\n                  sourceFile, targetFile));\r\n\r\n                FileInfo SourceFile <\/span><span style=\"color: #000000; \">=<\/span><span style=\"color: #000000; \"> <\/span><span style=\"color: #0000FF; \">new<\/span><span style=\"color: #000000; \"> FileInfo(sourceFile);\r\n                FileInfo TargetFile <\/span><span style=\"color: #000000; \">=<\/span><span style=\"color: #000000; \"> <\/span><span style=\"color: #0000FF; \">new<\/span><span style=\"color: #000000; \"> FileInfo(targetFile);\r\n\r\n                SourceFile.CopyTo(TargetFile.FullName, <\/span><span style=\"color: #0000FF; \">true<\/span><span style=\"color: #000000; \">);\r\n            }\r\n            <\/span><span style=\"color: #0000FF; \">catch<\/span><span style=\"color: #000000; \"> (Exception ex)\r\n            {\r\n                Trace.TraceError(ex.Message);\r\n            }\r\n        }\r\n    }\r\n}\r\n<\/span><\/div><\/pre>\n<\/div>\n<p>Das Starten eines asyncronen Kopiervorgangs&nbsp;erfolgt dann ganz einfach &#252;ber:<\/p>\n<div class=\"wlWriterSmartContent\" id=\"57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:b57caec1-5181-4f85-b110-ad444b3d617b\" contenteditable=\"false\" style=\"padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px\">\n<pre style=\"background-color:White;\"><div><!--\r\n\r\nCode highlighting produced by Actipro CodeHighlighter (freeware)\r\nhttp:\/\/www.CodeHighlighter.com\/\r\n\r\n--><span style=\"color: #0000FF; \">new<\/span><span style=\"color: #000000; \"> BackgroundCopyWorker(originalFileName, targetFileName);<\/span><\/div><\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Im vierten Teil meiner kleinen Serie zur &#252;berwachten Kopierfabrik, soll es nun darum gehen den Kopiervorgang in einen anderen Thread auszulagern. Das Problem ist n&#228;mlich, dass der lang anhaltende Kopiervorgang sonst das&nbsp;Erkennen weiterer Dateisystem-Ereignisse verhindert und der Dienst f&#252;r die Zeit des Kopierens &#8220;eingefroren&#8221; ist. Um nun den Kopiervorgang&nbsp;&#8220;parallel&#8221; zu starten, kann man in C# [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[12,29],"tags":[],"_links":{"self":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts\/158"}],"collection":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/comments?post=158"}],"version-history":[{"count":0,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/posts\/158\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/media?parent=158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/categories?post=158"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.navision-blog.de\/blog\/wp-json\/wp\/v2\/tags?post=158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}