Застрявший цикл отправки C #

#c# #loops #infinite

#c# #циклы #бесконечный

Вопрос:

Итак, я пытался использовать SendKey.Метод отправки с циклом for, и по какой-то причине он застревает в бесконечном цикле только тогда, когда я использую его там. Я пробовал код без него, и по какой-то причине это сработало.

     private void button1_Click(object sender, EventArgs e)
    {
        for (int i = 0; i < trackBar2.Value; i  )
        {
            SendKeys.Send("{ENTER}");
            System.Threading.Thread.Sleep(trackBar1.Value);
        }
    }
  

В чем, по-видимому, проблема?

* РЕДАКТИРОВАТЬ: это не может быть клавиша «Enter», потому что она делает то же самое с другими ключами и строками, например:

 SendKey.Send("a");
  

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

1. Каково значение trackBar2.Value , когда он застревает?

2. Ввод не отправляется на button1, что заставляет вас рекурсивно нажимать кнопку?

3. Это между 1-150. Я не думаю, что это действительно имеет значение, потому что я пробовал разные значения. @TimRogers

4. Я не думаю, что ввод приводит к этому, потому что я пробовал это с другими ключами и строками. @MicroVirus

5. TrackBar1 и TrackBar2. -> Отладка. Журнал (значение) => проверить окно вывода. [предположение: Поток. Режим ожидания (очень долгое время)]

Ответ №1:

Вы нажимаете button1, и в это время будет выполнен показанный код. Затем это отправляет Enter в button1 (потому что это все еще имеет фокус), заставляя этот код запускаться снова и т.д.

Таким образом, вы создали цикл.

Если вы попытаетесь, например, отправить другой ключ a , то программа на некоторое время зависнет из-за Thread.Sleep , но после этого должна снова стать отзывчивой.

Ответ №2:

Можете ли вы попробовать запустить свой SendKeys.Send("{ENTER}"); в фоновом потоке. Я не уверен, почему это блокирует ваш основной поток, но следующий подход работает.

   static void Main()
    {
        // setup some form state
        Form form = new Form();

        BackgroundWorker worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;

        // start the worker when the form loads
        form.Load  = delegate
        {
            worker.RunWorkerAsync();
        };
        worker.DoWork  = delegate
        {
            // this code happens on a background thread, so doesn't
            // block the UI while running - but shouldn't talk
            // directly to any controls
            for (int i = 0; i < 500; i  )
            {
                worker.ReportProgress(0, "Item "   i);
                Thread.Sleep(150);
            }
        };
        worker.ProgressChanged  = delegate(object sender,
           ProgressChangedEventArgs args)
        {
            SendKeys.Send("{Enter}");
        };
        Application.Run(form);
    }
  

После пятисот итераций мое приложение ответило обратно.