SSH.NET과 그 라이브러리를 통해 명령을 취소 할 수있는 방법을 구체적으로 말할 수는 없지만 접근 방법은 다음과 같습니다.
본질적으로 별도의 스레드 인 Task에서 "명령"을 실행할 것입니다. 여기 내 예제 코드입니다 :
private Task _commandTask;
private CancellationTokenSource _cancellation;
protected void SendCommand(object sender, EventArgs e)
{
if(_commandTask != null)
return; // Can't run the task twice
_cancellation = new CancellationTokenSource();
_commandTask = new Task(SendSshCommand, _cancellation.Token);
_commandTask.ContinueWith(FinishCommand, TaskScheduler.FromCurrentSynchronizationContext());
_commandTask.Start();
// returning control to the UI thread now
}
protected void CancelCommand(object sender, EventArgs e)
{
if(_commandTask == null)
return;
_cancellation.Cancel();
}
private static void SendSshCommand()
{
// Send your SSH Commands here
}
private void FinishCommand(Task task)
{
// Update your UI here
// remove this task
_commandTask = null;
_cancellation = null;
}
그래서 SendCommand
방법은 당신의 UI에 대한 몇 가지 이벤트에서 호출된다 (버튼 내가 가정 클릭). CancellationTokenSource
과 새 Task을 만듭니다. 이 태스크는 별도의 스레드에서 SendSshCommand
메소드를 호출합니다. 그런 다음 ContinueWith
메소드를 사용하여 작업 계속을 만듭니다. TaskScheduler.FromCurrentSyncrhonizationContext()
을 전달하면 연속 스레드가 별도의 스레드 대신 UI의 스레드에서 실행하려고한다는 것을 알 수 있습니다. 이것은 UI 스레드에없는 경우 UI 컨트롤에 액세스 할 수 없기 때문에 중요합니다.
CancelCommand
은 취소 버튼에서 호출되며 _commandTask
에 실행을 중지하도록 지시합니다.
지금은 100 %가 아니므로 작업에 넘어갈 필요가있는 상태를 유지할 것입니다.이 작업을 돕기 위해 Generic Task 구조가 있습니다. 또한 FinishCommand
에서 작업을 완료했는지, 취소하지 않았는지, 예외를 throw하지 않았는지 확인하려고 할 것입니다. .Net 4의 Tasks 및 TPL에 대한 정보를 읽으면이를 수행하는 방법을 알 수 있습니다.
취소 후 SSH.NET 라이브러리에서 어떤 일이 발생할 것인지 잘 모르겠다는 점도 유의해야합니다. SSH 세션의 연결을 해제하면 Unix 시스템에서 프로세스가 종료된다고 가정합니다. 그러나 다시 한 번, 특정 라이브러리에 익숙하지 않아 일부 테스트를 수행해야합니다.
희망 하시겠습니까?
.net의 버전은 무엇입니까? – CodingGorilla
.NET 4.0, 죄송합니다. – Hershizer33