У меня есть приложение C#, в котором я взаимодействую с другим окном через API Windows: (например, FindWindow()
, FindWindowEx()
).Thread.Sleep() или while()?
В одной конкретной части приложения я должен дождаться загрузки окна другого приложения, прежде чем нажимать кнопку, которая появляется (иногда для ее отображения требуется до трех секунд).
В настоящее время я делаю это:
IntPtr foohWnd = IntPtr.Zero;
while(foohWnd == IntPtr.Zero)
foohWnd = FindWindow(null, "Foo");
Как вы можете видеть, это просто продолжает проверки окна снова и снова и снова, не заботясь о ресурсах или что-нибудь подобное. (Не волнуйтесь, в моем фактическом коде это «тайм-аут» после бит, чтобы предотвратить бесконечный цикл).
Однако, другой способ я нашел, чтобы сделать это с помощью Thread.Sleep()
:
Thread.Sleep(3000);
foohWnd = FindWindow(null, "Foo");
Какой из этих двух является лучшей практикой? Есть ли еще лучший способ, чтобы я проигнорировал здесь?
Почему бы не объединить их с вами, чтобы спать в вашей петле, чтобы вы не привязывали процессор? – juharr
Ни один из них не является особенно удовлетворительным. В идеальном мире вы получите другой процесс, чтобы перезвонить вам, когда он будет готов. Если этот процесс выходит из-под контроля, используйте цикл while, но вставляйте короткий сон в него, чтобы избежать горячего процессора. –
«Есть ли еще лучший способ ...» - возможно, зависит от того, почему вы решили перейти на уровень API Windows в первую очередь. Например. использование UI Automation, чтобы вы могли взаимодействовать на более семантическом уровне, может быть уместным. Мы не знаем, что вы делаете, когда найдете * это окно. –