2011-04-11 112 views
1

我需要设置代码行运行后,一切都完成运行。任何人都知道如何做到这一点?c#如何设置代码运行在最后

private void ScanBT_Click(object sender, EventArgs e) 
     { 
      var folder = @"C:\Users\Shen\Desktop\LenzOCR\LenzOCR\WindowsFormsApplication1\ImageFile"; 

      DirectoryInfo directoryInfo; 
      FileInfo[] files; 
      directoryInfo = new DirectoryInfo(folder); 
      files = directoryInfo.GetFiles("*.jpg", SearchOption.AllDirectories); 

      var processImagesDelegate = new ProcessImagesDelegate(ProcessImages2); 
      processImagesDelegate.BeginInvoke(files, null, null); 


      **//HERE IS THE LINE OF CODE THAT NEED TO BE RUN AFTER EVERYTHING FINISH RUN 
      System.IO.File.Delete(@"C:\Users\Shen\Desktop\LenzOCR\TempFolder\tempPic.jpg");** 
     } 

     private void ProcessImages2(FileInfo[] files) 
     { 
      var comparableImages = new List<ComparableImage>(); 

      var index = 0x0; 

      foreach (var file in files) 
      { 
       if (exit) 
       { 
        return; 
       } 

       var comparableImage = new ComparableImage(file); 
       comparableImages.Add(comparableImage); 
       index++; 
      } 

      index = 0; 

      similarityImagesSorted = new List<SimilarityImages>(); 
      //MessageBox.Show("here"+singleFileInfo.FullName); 
      var fileImage = new ComparableImage(singleFileInfo); 

      for (var i = 0; i < comparableImages.Count; i++) 
      { 
       if (exit) 
        return; 

       var destination = comparableImages[i]; 
       var similarity = fileImage.CalculateSimilarity(destination); 
       var sim = new SimilarityImages(fileImage, destination, similarity); 
       similarityImagesSorted.Add(sim); 
       index++; 
      } 

      similarityImagesSorted.Sort(); 
      similarityImagesSorted.Reverse(); 
      similarityImages = new BindingList<SimilarityImages>(similarityImagesSorted); 

      var buttons = 
       new List<Button> 
        { 
         ScanBT 
        }; 

      if (similarityImages[0].Similarity > 70) 
      { 
       con = new System.Data.SqlClient.SqlConnection(); 
       con.ConnectionString = "Data Source=SHEN-PC\\SQLEXPRESS;Initial Catalog=CharacterImage;Integrated Security=True"; 
       con.Open(); 

       String getFile = "SELECT ImageName, Character FROM CharacterImage WHERE ImageName='" + similarityImages[0].Destination.ToString() + "'"; 
       SqlCommand cmd2 = new SqlCommand(getFile, con); 
       SqlDataReader rd2 = cmd2.ExecuteReader(); 

       while (rd2.Read()) 
       { 
        for (int i = 0; i < 1; i++) 
        { 
         string getText = rd2["Character"].ToString(); 
         Action showText =() => ocrTB.AppendText(getText); 
         ocrTB.Invoke(showText); 
        } 
       } 
       con.Close(); 
      } 
      else 
      { 
       MessageBox.Show("No character found!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 


     } 
+0

异步调用完成后,在主线程上触发一个事件ProcessCompleted。或者使用BackgroundWorker来代替... http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx – mservidio 2011-04-11 15:02:06

+0

@mservidio您正在写信给他,好像他知道他在做什么。 ;-)。 – 2011-04-11 15:09:05

+0

记得在找到一个答案时接受正确的答案。 – Marco 2011-04-11 15:18:52

回答

1

如何将删除文件的代码行删除到过程映像方法的结尾?

+1

您将需要更改方法,以便它不具有多个退出点(它目前的功能),如果使用这种方法进行操作:)尽管事实被告知,但我无法看到退出源自哪里... – forsvarir 2011-04-11 15:03:15

+0

非常好的一点,我错过了回报。您可以将delete命令封装在方法中并在每个return语句之前添加。 – WraithNath 2011-04-11 15:10:40

1
  • worker.RunWorkerAsync运行在BackgroundWorker.DoWork ProcessImages2方法中的代码(...)
  • 替代ProcessImagesDelegate.BeginInvoke(文件,NULL,NULL)(...)
  • 捕获事件RunWorkerCompleted并在那里执行File.Delete(...)

通过这种方式,您的主线程可以自由刷新并由最终用户使用。

0

如果您编辑下面的方法,则调用将会阻塞,直到ProcessImages2完成。

var processImagesDelegate = new ProcessImagesDelegate(ProcessImages2); 
IAsyncResult result = processImagesDelegate.BeginInvoke(files, null, null); 
result.AsyncWaitHandle.WaitOne(); 
**//HERE IS THE LINE OF CODE THAT NEED TO BE RUN AFTER EVERYTHING FINISH RUN 
System.IO.File.Delete(@"C:\Users\Shen\Desktop\LenzOCR\TempFolder\tempPic.jpg"); 
+0

我不确定,但在这种情况下,主线程将被锁定,等待其他线程完成。如果主线程是GUI,这对用户来说不是好事... – Marco 2011-04-11 15:11:42