c # как настроить запуск кода в финале

#c# #asynchronous #final

#c# #асинхронный #Финал

Вопрос:

Мне нужно настроить строку кода для запуска после завершения всего. Кто-нибудь знает, как это сделать?

 private void ScanBT_Click(object sender, EventArgs e)
        {
            var folder = @"C:UsersShenDesktopLenzOCRLenzOCRWindowsFormsApplication1ImageFile";

            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:UsersShenDesktopLenzOCRTempFoldertempPic.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);
            }


        }
  

Комментарии:

1. После завершения вашего асинхронного вызова запустите процесс события, завершенный в главном потоке. Или вместо этого используйте BackgroundWorker … msdn.microsoft.com/en-us/library /…

2. @mservidio Ты пишешь ему так, как будто он знает, что делает. ;-).

3. не забудьте принять правильный ответ, когда вы его найдете.

Ответ №1:

Как насчет того, чтобы переместить строку кода для удаления файла в конец метода process images?

Комментарии:

1. Вам нужно будет изменить метод, чтобы у него не было нескольких точек выхода (что в настоящее время и происходит), если вы придерживаетесь этого подхода 🙂 Хотя, по правде говоря, я не вижу, откуда берется exit…

2. Очень хороший момент, я пропустил инструкции return. Вы могли бы обернуть команду delete в метод и добавлять перед каждым оператором return.

Ответ №2:

  • Запустите код внутри метода ProcessImages2 в BackgroundWorker.DoWork(…)
  • Замените ProcessImagesDelegate.BeginInvoke(files, null, null) с помощью worker.RunWorkerAsync(…)
  • Перехватите событие Runworker Completed и запустите там файл.Удалить(…).

Таким образом, ваш основной поток может свободно обновляться и использоваться конечным пользователем.

Ответ №3:

Если вы отредактируете метод, как показано ниже, вызов будет блокироваться до завершения 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:UsersShenDesktopLenzOCRTempFoldertempPic.jpg");  
  

Комментарии:

1. Я не уверен, но в этом случае основной поток будет заблокирован в ожидании завершения другого потока. Если основной поток является графическим интерфейсом, это не может быть хорошо для пользователя…