Многопоточный код застрял с оператором Form.ShowDialog () - PullRequest
3 голосов
/ 03 октября 2011

Я новичок в C # и пытался написать форму для проверки сетевого подключения.Идея состоит в том, чтобы поместить часть соединения в поток и показать диалог хода выполнения во время соединения.Ниже мой код:

Form_TestingConnection testingConnection = new Form_TestingConnection();
Thread t1 = new Thread(TestConnection);

try
{
testingConnection.ShowDialog();
t1.Start();    
}
catch (Exception ex)
{
    Logger.Error(ex);
if (MessageBox.Show(
    Resources.message_connection_issue,
    Resources.title_connection_issue,
    MessageBoxButtons.OK, MessageBoxIcon.Error) == DialogResult.OK)
{
    loginSuccessful = false;
}
}

TestConnection - это метод для проверки соединения и установки статического члена loginSuccessful на основе результата.Проблема, с которой я сталкиваюсь сейчас, заключается в том, что код застрял с testingConnection.ShowDialog ().Всякий раз, когда он выполняет в этом месте, он никогда не идет вперед.Какие-либо предложения?Большое спасибо.

Ответы [ 2 ]

4 голосов
/ 03 октября 2011

ShowDialog показывает форму модально. Это означает, что форма будет отображаться, все другие формы будут отключены, и функция ShowDialog не вернется, пока не закроется модальное диалоговое окно.

Используйте взамен Show. Это показывает форму немодальной. Когда вы это сделаете, функция Show немедленно вернется, а форма останется открытой.

Вы можете думать о ShowDialog как о синхронном, а Show как об асинхронном.

Убедитесь, что любые методы в потоке, которым необходимо обновить прогресс в форме, вызываются с помощью Invoke или BeginInvoke, чтобы убедиться, что они выполняются в контексте основного потока пользовательского интерфейса.

Наконец, ваш код в том виде, в каком он есть, не ждет, пока поток выполнит свою работу. Блок try / catch оборачивает только показ формы и начало выполнения потока (t1.Start()). Когда вы вызываете Start в потоке, этот вызов возвращается асинхронно, и поток продолжает выполнять свою работу. Я не совсем уверен, что ваш код пытается сделать, но я подозреваю, что блок catch должен быть внутри потока.

0 голосов
/ 03 октября 2011

Если вы пытаетесь получить доступ к любому компоненту GUI, который принадлежит потоку из другого потока, вы должны использовать InvokeRequired , чтобы избежать исключений между потоками

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...