Как приостановить и возобновить циклы в C#
Экс:-
for(int i=0;i <=10;i++) { Messagebox.show(i.ToString()); //*Here I want something like pause, so if I click Pause button of WinForms and consider i=4, then this loop must pause, until not going to click on Resume button. And if now click on Resume button after 5-10 minutes then it should start from same state where we paused (from i=4) *// //Why I am looking for this I extract list of .sql files in a folder then open each .sql file and do some text extraction to extract table name, and then I create script with help of these tables names in a loop, file by file so I want a pause button in between of loop to see Original text, extract table name and further dynamically created text on Winforms, if required to check randomly. For which I am looking Pause/Resume functionality in a loop(I am using foreach loop)*// } //Actual Program try { //using LINQ StringBuilder result = new StringBuilder(); string connetionString = null; foreach (XElement level1Element in XElement.Load(ManifestFile).Elements("Objects")) { if (level1Element.Attribute("AssetClass").Value.ToUpper() == "Common".ToUpper()) { connetionString = System.Configuration.ConfigurationManager.AppSettings["UAT_EQ"].ToString(); } cnn = new SqlConnection(connetionString); cnn.Open(); CreateTempTable(cnn); result.AppendLine(level1Element.Attribute("AssetClass").Value); foreach (XElement level2Element in level1Element.Elements("DeployObject")) { result.AppendLine(" " + level2Element.Value); TxtReader(level1Element.Attribute("AssetClass").Value.ToString(),level2Element.Value.ToString(), string.Concat(string.Concat(fPath, level1Element.Attribute("AssetClass").Value), string.Concat("\\", level2Element.Value)), cnn); Thread.Sleep(1000); //Here I am looking for Pause and Resume functionality } ExtractTableName(cnn); CreateFile(cnn); cnn.Close(); }
Пожалуйста, помогите мне в этом.
Что я уже пробовал:
Попробовал Гугл и нашел:-
Приостановка и возобновление цикла For В C# - переполнение стека[^]
Класс BackgroundWorker (System.ComponentModel)[^]
Но проблема в backgroundWorker1. CancelAsync (); не приостанавливайте цикл, он останавливает цикл , но я хочу, чтобы цикл начинался с той позиции, где мы его приостановили, по щелчку Resume.
Philippe Mori
Сколько времени требуется для обработки одного элемента? При приостановке можно ли завершить текущий элемент? Сколько у вас предметов?
Эти детали важны для того, чтобы предложить лучшее решение, так как в противном случае мы можем только догадываться, но это может быть не лучшее решение.
Кстати, вы, вероятно, не хотите держать соединение открытым, находясь в состоянии паузы.
StackQ
// Почему я ищу это
Я извлекаю список файлов. sql из xml-файла, затем открываю каждый файл. sql и делаю некоторое извлечение текста, чтобы извлечь имя таблицы, а затем создаю необходимый скрипт с помощью этих извлеченных имен таблиц в цикле, один за другим
Обязательные ответы на вышеприведенный комментарий:-
- На обработку одного предмета вряд ли уйдет 1-2 секунды.
- Когда вы делаете паузу, не хотите ничего прерывать, просто хотите сделать паузу.(Предположим, у меня есть файл 10 .sql, в цикле, если i=5, значит, я обработал 5 файлов, теперь, если приостановлен, то он получит паузу,а если возобновится отсюда через 10-15 минут, то обработка должна начаться с i=6, значит, с 6-го файла)
- Сколько у вас элементов?> У меня есть xml-файл, где будет список файлов. sql, максимальное количество файлов. sql будет от 400 до 500
И да, я не хочу держать соединение открытым, находясь в состоянии паузы. Но это не будет проблемой,потому что это среда UAT, и все обрабатывается только с помощью глобальной временной таблицы и временных хранимых процедур. В базе данных нет никакого реального объекта.