2015-05-08 3 views
0

после нажатия на нижнюю часть выполнения команда ssh отправляется и выполняется отлично, но после нее приложение зависает, и я не могу нажать любую другую кнопку. Это код:C# application freezes

private void timer1_Tick(object sender, EventArgs e) 
{ 
    try 
    { 
     SshClient cSSH = new SshClient("ip", 22, "root", "pass"); 
     cSSH.Connect(); 
     SshCommand x = cSSH.RunCommand("ssh command"); 
     cSSH.Disconnect(); 
     cSSH.Dispose();      
    } 
    catch (Exception error) 
    { 
     MessageBox.Show("Error:" + error); 
    } 
} 

редактировать:

код застрял на следующей строке:

SshClient cSSH = new SshClient("ip", 22, "root", "pass"); 
+3

Что это точная линия, где она замерзает? – besplash

+3

Это потому, что ваш код работает в одном потоке с пользовательским интерфейсом. Создайте еще один поток и запустите код здесь. –

+1

Боковое примечание: не используйте 'Dispose()' явно, используйте «using» вместо: 'using (SshClient cSSH = new ...) {...}' –

ответ

1

Вы можете использовать Task для этого:

private void timer1_Tick(object sender, EventArgs e) 
{ 
    Task.Factory.StartNew(() => 
    { 
     using (SshClient cSSH = new SshClient("ip", 22, "root", "pass") 
     { 
      cSSH.Connect(); 
      SshCommand x = cSSH.RunCommand("ssh command"); 
     } 
    }); 
} 
+3

Этот метод вернется до завершения задачи. Нет смысла обертывать его в блок try ... catch, потому что, если что-то пойдет не так, вы не услышите об этом. Вам придется подождать задание, чтобы исключить пузырьки, и в этом случае вы вернетесь к квадрату. –

+3

'' StartNew'' запускает поток асинхронно, поэтому '' try'', '' catch'' не имеет эффекта –

+0

@Asad - это именно то, что мы хотим. – greenhoorn

Смежные вопросы