Недопустимая операция кросс-потока: управление 'form1' осуществляется из потока, отличного от потока, в котором оно было создано." + C# + winform
private void button2_Click(object sender, EventArgs e) { searchpattern = txtpatterns.Lines; searchpattern = searchpattern.Take(searchpattern.Count() - 1).ToArray(); sourcepath = txtsourcepath.Text; destinationpath = txtUnzippath.Text; BuildingNames = txtbuildings.Lines; BuildingNames = BuildingNames.Take(BuildingNames.Count() - 1).ToArray(); #region Validating Required Fields if (txtsourcepath.TextLength == 0) { MessageBox.Show("Please Enter the Search Directory path"); } else if (txtpatterns.TextLength == 0) { MessageBox.Show("Please Enter the Start Date and End date to start the process"); } else if (txtUnzippath.TextLength == 0) { MessageBox.Show("Please Enter the path to unzip the File"); } else if (txtbuildings.TextLength == 0) { MessageBox.Show("Please Select the buildings from the list"); } #endregion else { //SQL_Bulk_Copy oHelper = new SQL_Bulk_Copy(); //string logFilePath = @"C:\Users\jqy9jzy\Desktop\Testing\SVRP0008C8B9\SVRP0008C8B9Unzip\DataFeed_20180419_6276.log"; //oHelper.BulkInsertIntoDatabase(logFilePath); Task task = new Task(Callmethod); task.Start(); task.Wait(); } } public async void Callmethod() { Hide(); foreach (var pattern in searchpattern) { var txtFiles = Directory.EnumerateFiles(sourcepath, pattern, SearchOption.AllDirectories); foreach (string filepath in txtFiles) { zipfilepath.Add(filepath); } } Task<int> task = ReadFile.FILE_C(zipfilepath); int count = await task; if (count == zipfilepath.Count) { Directory.Delete(Unzip.destinationpath, true); bool directoryExists = Directory.Exists(Unzip.destinationpath); Close(); } }
Код ReadFile :
public class ReadFile { protected internal static async Task<int> FILE_C(List<string> zipfilepath) { int count = 0; try { if (!Directory.Exists(Unzip.destinationpath)) { Directory.CreateDirectory(Unzip.destinationpath); } foreach (string filepath in zipfilepath) { await Task.Run(()=> Unzip.data(filepath)); count += 1; } } catch (Exception ex) { throw ex; } return count; } }
Что я уже пробовал:
У меня есть список Zipfilepath, я создаю каталог, распаковываю его и загружаю в sql.
Это фактический процесс моего заявления.
Я хочу сделать это асинхронно, потому что у меня есть около 1500 файлов в этом списке.
Он должен распаковать, прочитать и загрузить файл в sql async,который имеет ожидание до тех пор, пока он не завершит цикл, после завершения цикла приложение должно автоматически закрыться.
Когда я пытаюсь работать с приведенным выше кодом, я получаю следующую ошибку.
Ошибка: "операция кросс-потока недопустима: элемент управления 'Form1' доступен из потока, отличного от потока, в котором он был создан." + c# + winform"
Заранее благодарю, любая помощь будет оценена по достоинству.
Gerry Schmitz
Я не вижу никакого смысла запускать эту асинхронность.
Это не похоже на то, что у вас есть 1500 "каналов".
Отдайте "все дело" фоновому работнику и займитесь другими делами.