У меня есть небольшое приложение, закодированное в C# (Windows Form) (визуальный штифт 2012) , когда я запускаю приложение, оно работает правильно, за исключением того, что при запуске приложения я больше не могу нажмите на окно или даже переместите его, пока он не завершит процесс. как я могу решить эту проблему?окно заблокировано, когда приложение запущено C#
ответ
Посмотрите, используя BackgroundWorker Class
Выполняет операцию на отдельном потоке.
Класс BackgroundWorker позволяет запускать отдельную выделенную цепочку для отдельного потока . Длительные операции, такие как загрузки и транзакции базы данных, могут привести к тому, что ваш пользовательский интерфейс (UI) будет казаться , как будто он перестает отвечать на запросы во время работы. Когда вы хотите реагировать на пользовательский интерфейс, и вы столкнулись с длинными задержками, связанными с такими операциями , класс BackgroundWorker предоставляет удобное решение .
Threads again :( Я не так хорош в этой теме, но я постараюсь иметь представление об этом (я пытался сделать индикатор прогресса с потоком, но, наконец, я его подвешивал) – user1863359
Я не знаю, t знать, как поместить мой код в: private void backgroundWorker_DoWork (object sender, DoWorkEventArgs e) {} , потому что метод, требующий много времени, вызывается, когда пользователь нажимает кнопку 10 public partial class Welcome: Form { частное BackgroundWorker backgroundWorker1; публика Welcome() { } частная пустота Button3Click (объект отправителя, EventArgs е) { // вызов метода, который занимает много времени } } – user1863359
Похоже, вы делаете свою обработку в потоке пользовательского интерфейса. Любая обработка, выполняемая в потоке пользовательского интерфейса, устраняет циклы, которые могут обслуживаться событиями пользовательского интерфейса.
Вы можете реализовать BackgroundWorker Control/Class.
Для этого просто перетащите элемент управления BackgroundWorker
с панели инструментов на форму. Выберите созданного фонового работника и дважды щелкните по нему. Теперь поместите весь код, который вам нужно сделать отдельно от пользовательского интерфейса, в это событие.
Пример:
//Assuming we have a background worker called backgroundWorker
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) {
//put code here
}
В настоящее время в инициирующем блоке кода, вызовите backgroundWorker.RunWorkerAsync()
.
Пример:
private buttonDoWork_Click(object sender, EventArgs e) {
backgroundWorker.RunWorkerAsync();
}
Просто будьте осторожны и быть threadsafe.
woooow !!! теперь исправлено: D Спасибо Я постараюсь сделать то же самое, чтобы исправить обновление индикатора выполнения – user1863359
Переместите произведение в отдельный поток. Найдите здесь '[C#] Справочный работник'. –
Итак, поток занят. Хм. Не могли бы вы поделиться кодом, который используете, который занимает поток? Может быть, мы можем дать некоторые указатели. – SchautDollar