2013-06-20 6 views
-1

У меня есть небольшое приложение, закодированное в C# (Windows Form) (визуальный штифт 2012) , когда я запускаю приложение, оно работает правильно, за исключением того, что при запуске приложения я больше не могу нажмите на окно или даже переместите его, пока он не завершит процесс. как я могу решить эту проблему?окно заблокировано, когда приложение запущено C#

+2

Переместите произведение в отдельный поток. Найдите здесь '[C#] Справочный работник'. –

+0

Итак, поток занят. Хм. Не могли бы вы поделиться кодом, который используете, который занимает поток? Может быть, мы можем дать некоторые указатели. – SchautDollar

ответ

0

Посмотрите, используя BackgroundWorker Class

Выполняет операцию на отдельном потоке.

Класс BackgroundWorker позволяет запускать отдельную выделенную цепочку для отдельного потока . Длительные операции, такие как загрузки и транзакции базы данных, могут привести к тому, что ваш пользовательский интерфейс (UI) будет казаться , как будто он перестает отвечать на запросы во время работы. Когда вы хотите реагировать на пользовательский интерфейс, и вы столкнулись с длинными задержками, связанными с такими операциями , класс BackgroundWorker предоставляет удобное решение .

+0

Threads again :( Я не так хорош в этой теме, но я постараюсь иметь представление об этом (я пытался сделать индикатор прогресса с потоком, но, наконец, я его подвешивал) – user1863359

+0

Я не знаю, t знать, как поместить мой код в: private void backgroundWorker_DoWork (object sender, DoWorkEventArgs e) {} , потому что метод, требующий много времени, вызывается, когда пользователь нажимает кнопку 10 public partial class Welcome: Form { частное BackgroundWorker backgroundWorker1; публика Welcome() { } частная пустота Button3Click (объект отправителя, EventArgs е) { // вызов метода, который занимает много времени } } – user1863359

0

Похоже, вы делаете свою обработку в потоке пользовательского интерфейса. Любая обработка, выполняемая в потоке пользовательского интерфейса, устраняет циклы, которые могут обслуживаться событиями пользовательского интерфейса.

3

Вы можете реализовать 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.

+0

woooow !!! теперь исправлено: D Спасибо Я постараюсь сделать то же самое, чтобы исправить обновление индикатора выполнения – user1863359