У нас есть настольное приложение, которое выполняет довольно строгий набор вычислений в фоновом потоке. Части этого вычисления выполняются в неуправляемой библиотеке, к которой мы получаем доступ через взаимодействие. Мы обнаруживаем, что когда мы запускаем вычисления, поток пользовательского интерфейса перестает отвечать на запросы во время вычислений. У нас сложилось впечатление, что фреймворк будет обрабатывать переключение потоков, чтобы пользовательский интерфейс продолжал реагировать, но это не так. Мы обнаружили, что мы можем вставить Thread.Sleep (0) или Application.DoEvents (), чтобы позволить пользовательскому интерфейсу реагировать. Это имеет побочный эффект замедления расчета. Кроме того, на части вычислений, выполняемых неуправляемым кодом, может потребоваться до 30 секунд, и в течение этого времени приложение всегда не отвечает. Весь расчет может занять от двух до пяти минут.
Это приводит к следующим вопросам:
- Что такое модель потоков .NET Framework с точки зрения пользовательского интерфейса и взаимодействия?
- Мы ошибаемся, полагая, что среда должна обрабатывать переключение потоков между фоновым потоком и потоками пользовательского интерфейса?
- В чем разница между использованием Thread.Sleep и Application.DoEvents в этой ситуации, и один из них предпочтительнее другого?