OSDN Git Service

asyncを使用するようにした
authorkonekoneko <jbh03215@gmail.com>
Thu, 18 Oct 2012 09:07:13 +0000 (18:07 +0900)
committerkonekoneko <jbh03215@gmail.com>
Thu, 18 Oct 2012 09:07:13 +0000 (18:07 +0900)
CompleteEraser/BreakRecyleBin.cs
CompleteEraser/IOperation.cs
CompleteEraser/MainForm.cs
CompleteEraser/Properties/AssemblyInfo.cs
CompleteEraser/ShrredFiles.cs

index 61ed0da..0b00b88 100644 (file)
@@ -2,6 +2,8 @@
 using System.Collections.Generic;\r
 using System.Runtime.InteropServices;\r
 using System.IO;\r
+using System.Threading;\r
+using System.Threading.Tasks;\r
 \r
 namespace CompleteEraser\r
 {\r
@@ -18,8 +20,9 @@ namespace CompleteEraser
 \r
         public event ProgressingEventHandler Progressing;\r
         public event ProgressedEventHandler Progressed;\r
+        public event EventHandler Complete;\r
 \r
-        public void Execute(IEnumerable<string> files)\r
+        public async void ExecuteAsync(IEnumerable<string> files,CancellationToken cancelToken)\r
         {\r
             foreach (string file in files)\r
             {\r
@@ -27,17 +30,27 @@ namespace CompleteEraser
 \r
                 try\r
                 {\r
-                    FileBreaker.BreakFileOrFolder(file);\r
+                    await Task.Factory.StartNew(() =>\r
+                    {\r
+                        FileBreaker.BreakFileOrFolder(file);\r
+                    }, cancelToken);\r
                 }\r
-                catch(IOException){\r
+                catch (OperationCanceledException)\r
+                {\r
+                    return;\r
+                }\r
+                catch (IOException)\r
+                {\r
                     //ゴミ箱の中にフォルダーがあるとIOErrorがでるので握りつぶす\r
                 }\r
 \r
-                Progressed(this, new ProgressedEventArgs(file,null));\r
+                Progressed(this, new ProgressedEventArgs(file, null));\r
             }\r
 \r
             Progressing(this, new ProgressingEventArgs(null));\r
             SHEmptyRecycleBin(IntPtr.Zero, "", SHERB_NOCONFIRMATION | SHERB_NOPROGRESSUI);\r
+\r
+            this.Complete(this, null);\r
         }\r
     }\r
 }\r
index f7d2644..dabefde 100644 (file)
@@ -1,5 +1,6 @@
 using System;\r
 using System.Collections.Generic;\r
+using System.Threading;\r
 \r
 namespace CompleteEraser\r
 {\r
@@ -33,6 +34,7 @@ namespace CompleteEraser
     {\r
         event ProgressingEventHandler Progressing;\r
         event ProgressedEventHandler Progressed;\r
-        void Execute(IEnumerable<string> targets);\r
+        event EventHandler Complete;\r
+        void ExecuteAsync(IEnumerable<string> targets, CancellationToken cancelToken);\r
     }\r
 }\r
index 5d6bcdc..9b8a869 100644 (file)
@@ -51,6 +51,12 @@ namespace CompleteEraser
             this.progressBar1.Maximum = this.files.Count();\r
             this.op.Progressing += new ProgressingEventHandler(op_Progressing);\r
             this.op.Progressed += new ProgressedEventHandler(op_Progressed);\r
+            this.op.Complete += op_Complete;\r
+        }\r
+\r
+        void op_Complete(object sender, EventArgs e)\r
+        {\r
+            this.Close();\r
         }\r
 \r
         private void MainForm_Shown(object sender, EventArgs e)\r
@@ -63,40 +69,23 @@ namespace CompleteEraser
 \r
             this.tokenSource = new CancellationTokenSource();\r
 \r
-            this.task = new Task(() =>\r
-            {\r
-                op.Execute(this.files);\r
-            });\r
-            this.task.ContinueWith((t) =>\r
-            {\r
-                this.BeginInvoke(new Action(() =>\r
-                {\r
-                    this.Close();\r
-                }));\r
-            });\r
-            this.task.Start();\r
+            op.ExecuteAsync(this.files,this.tokenSource.Token);\r
         }\r
 \r
         void  op_Progressing(object sender, ProgressingEventArgs e)\r
         {\r
-            this.BeginInvoke(new Action(() =>\r
-            {\r
-                if (e.fileName == null)\r
-                    this.label2.Text = Resources.FINAL_PROCESS;\r
-                else\r
-                    this.label2.Text = string.Format(Resources.FILE_PROCESS, this.TrimFullPath(e.fileName));\r
-            }));\r
+            if (e.fileName == null)\r
+                this.label2.Text = Resources.FINAL_PROCESS;\r
+            else\r
+                this.label2.Text = string.Format(Resources.FILE_PROCESS, this.TrimFullPath(e.fileName));\r
         }\r
 \r
         void op_Progressed(object sender, ProgressedEventArgs e)\r
         {\r
-            CancellationToken token = this.tokenSource.Token;\r
-            if (token.IsCancellationRequested)\r
-                token.ThrowIfCancellationRequested();\r
-\r
             if (e.ex == null)\r
             {\r
-                this.BeginInvoke(new Action(() => { if (this.progressBar1.Value < this.progressBar1.Maximum) this.progressBar1.Value++; }));\r
+                if (this.progressBar1.Value < this.progressBar1.Maximum)\r
+                    this.progressBar1.Value++;\r
             }else if(e.ex is IOException){\r
                 DialogResult result = MessageBox.Show(e.ex.Message, "", MessageBoxButtons.AbortRetryIgnore);\r
                 switch (result)\r
@@ -116,6 +105,8 @@ namespace CompleteEraser
                     ProcessStartInfo info = new ProcessStartInfo(Application.ExecutablePath);\r
                     info.Verb = "runas";\r
                     info.UseShellExecute = true;\r
+                    if (this.info == null)\r
+                        info.Arguments = string.Join(" ", this.files);\r
                     Process.Start(info);\r
                     this.Hide();\r
                     Thread.Sleep(1000);\r
index 66425f4..507c86c 100644 (file)
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
 // すべての値を指定するか、下のように '*' を使ってビルドおよびリビジョン番号を \r
 // 既定値にすることができます:\r
 // [assembly: AssemblyVersion("1.0.*")]\r
-[assembly: AssemblyVersion("1.17.0.0")]\r
-[assembly: AssemblyFileVersion("1.17.0.0")]\r
+[assembly: AssemblyVersion("1.18.0.0")]\r
+[assembly: AssemblyFileVersion("1.18.0.0")]\r
index cbe27f0..93161d1 100644 (file)
@@ -1,6 +1,8 @@
 using System;\r
 using System.Collections.Generic;\r
 using System.IO;\r
+using System.Threading;\r
+using System.Threading.Tasks;\r
 \r
 namespace CompleteEraser\r
 {\r
@@ -8,19 +10,27 @@ namespace CompleteEraser
     {\r
         public event ProgressingEventHandler Progressing;\r
         public event ProgressedEventHandler Progressed;\r
+        public event EventHandler Complete;\r
 \r
-        public void Execute(IEnumerable<string> files)\r
+        public async void ExecuteAsync(IEnumerable<string> files, CancellationToken cancelToken)\r
         {\r
             foreach (string file in files)\r
             {\r
-                Progressing(this,new ProgressingEventArgs(file));\r
+                Progressing(this, new ProgressingEventArgs(file));\r
 \r
             RETRY:\r
-                ProgressedEventArgs e = new ProgressedEventArgs(file,null);\r
+                ProgressedEventArgs e = new ProgressedEventArgs(file, null);\r
 \r
                 try\r
                 {\r
-                    FileBreaker.BreakFileOrFolder(file);\r
+                    await Task.Factory.StartNew(() =>\r
+                    {\r
+                        FileBreaker.BreakFileOrFolder(file);\r
+                    }, cancelToken);\r
+                }\r
+                catch (OperationCanceledException)\r
+                {\r
+                    break;\r
                 }\r
                 catch (UnauthorizedAccessException uae)\r
                 {\r
@@ -36,6 +46,7 @@ namespace CompleteEraser
                 if (e.breaked)\r
                     break;\r
             }\r
+            this.Complete(this, null);\r
         }\r
     }\r
 }\r