c#如何设置最终运行的代码

时间:2011-04-11 14:58:39

标签: c# asynchronous final

我需要将代码行设置为在所有内容完成运行后运行。有谁知道怎么做?

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);
            }


        }

3 个答案:

答案 0 :(得分:1)

如何移动代码行将文件删除到过程图像方法的末尾?

答案 1 :(得分:1)

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

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

答案 2 :(得分: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");