#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);
}
После пятисот итераций мое приложение ответило обратно.