#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. Я не уверен, но в этом случае основной поток будет заблокирован в ожидании завершения другого потока. Если основной поток является графическим интерфейсом, это не может быть хорошо для пользователя…