2014-09-30 10 views
0

내 솔루션에서 일부 단어 자동화가 buttonclick에 의해 시작되는 사용자 인터페이스가 있습니다 (이 단추를 wordStart 단추로 호출 할 수 있음). 나는이 버튼 자동화를 다른 buttonclick으로 깨고 싶다.UI에서 코드의 단일 스레드 실행을 중지 할 수 있습니까?

그러나 단어를 클릭하면 작업을 수행하는 동안 사용자 인터페이스가 멈추고 단어 깜박임 버튼을 클릭 할 수 없습니다. 아직 프로그래밍에 익숙하지 않아서 응용 프로그램이 단일 스레드이거나 적어도 멀티 스레드로 해결할 수 있기 때문에 이것이 반드시 있어야합니다.

그래서 2in1 질문입니다. 1. 단일 스레드 응용 프로그램으로 코드 실행을 중지 할 수 있습니까? 2. 코드 실행을 어떻게 중지합니까? 질문 번호 2의

나는 인터넷의 주위에 조금 보면서 내가 일을 생각 이러한 방법을 찾았지만, 다른 제안을 환영합니다 :

Application.Exit 

Application.Shutdown 

Environment.Exit 

편집 : 내가 생각 이 멀티로 수행해야합니다 스레딩. 그렇게 많은 경험이 없으므로 누구든지 나를 도와주고 싶다면이 코드를 질문에 추가했습니다. 그 동안 나는이 문제에 대한 해결책을 스스로 찾아 볼 것입니다.

private void generateButton_Click(object sender, EventArgs e) 
    { 
     //Thread or backgroundworker should handle this event? 
     commandsChosed(); //Event to be throwed - this starts the word automation 
    } 

    private void stopButton_Click(object sender, EventArgs e) 
    { 
     //Stop/pause the working thread 
    } 
+0

실제로는 단일 스레드에서 수행 할 수 없으므로 다중 스레드가 방법입니다. 당신이 언급하는 방법은 당신이 달성하고자하는 것과는 아무런 관련이 없습니다! .NET 버전 4 이상을 사용하는 경우 멀티 스레딩을 쉽게하기 위해 TPL (작업)을 볼 수 있습니다. http://msdn.microsoft.com/en-us/library/dd537609(v=vs.110).aspx – Belogix

+0

버튼 클릭시 새 스레드 시작, http://msdn.microsoft.com/en-in/library /aa645740(v=vs.71).aspx – CodingDefined

+0

코드를 보여줄 수 있습니까? –

답변

0

아니요, 단일 스레드 만 사용하여 실행이 완료 될 때까지 차단됩니다. 취소/일시 중지 할 수있게하려면 작업에 다른 스레드를 사용해야합니다. 예를 들어 BackgroundWorker을 사용할 수 있습니다.

+0

비록 내가 단일 스레드로 할 수 있었으면 좋겠다고 생각한 것처럼. 이제는 프로그램의 아키텍처를 재고해야합니다. –

+1

멀티 스레딩 및 비동기 프로그래밍을 올바른 방향으로 배우는 사람을 조종하려한다면 Task Parallel Library가 더 현명한 선택입니다. PCL에서 이미 삭제 된 'BackgroundWorker'와는 달리 언제 어디서나 분명히 가지 않으므로 더 현명한 선택입니다. Windows 스토어 앱 AFAIK). –

+0

@KirillShlenskiy, 그런 상황에서 BW를 ​​사용할 수 없다는 정보는 어디서 얻었습니까? MSDN은 AFAIK와 BW가 일반적으로 TPL에 비해 초보자 용으로 이해하고 이해하기 쉽습니다. 또한 예를 들어 BW 만 제공 한 것이지 최종 해결책은 아닙니다. 가장 중요한 부분은 처음 두 문장입니다. – walther

0

비슷한 문제가있는 경우 내 대답을 내 개인적인 질문에 게시하고 싶습니다. 이 질문에 대한 다른 사람들의 제안에 따라 클립 보드 사용과 같은 OLE 기능을 허용하지 않기 때문에 backgroundworker로 구현할 수 없었습니다.하지만 이것은 내 스레드가 처리하는 것에 국한됩니다. backgroundworker는 많은 상황에서 유용 할 수 있지만 threadpool에 있기 때문에 STA로 설정할 수는 없습니다.

Thread workerThread; 

private void generateButton_Click(object sender, EventArgs e) 
    { 
     generateButton.Visible = false; 
     stopButton.Visible = true; 

     //Setting up a background thread 
     workerThread = new Thread(new ThreadStart(handleGenerateButtonClick)); 
     workerThread.SetApartmentState(ApartmentState.STA); //In STA state the thread can use OLE functions like clipboard and handle some UI components as well. 
     workerThread.IsBackground = true; //It shuts down if the mainthread shuts down 
     workerThread.Start(); 

     try 
     { 
      //Checking whether the currentThread is not the workerThread before blocking the currentThread until workerThread has terminated 
      if (Thread.CurrentThread != workerThread) 
      { 
       //Wait until workerThread has terminated 
       workerThread.Join(); 
      } 
      //Sets the window buttons after workerThread has finished 
      if (!workerThread.IsAlive) 
      { 
       generateButton.Visible = true; 
       stopButton.Visible = false; 
      } 
     } 
     catch 
     { 
     } 
    } 

    private void stopButton_Click(object sender, EventArgs e) 
    { 
     generateButton.Visible = true; 
     stopButton.Visible = false; 

     //Stops the worker thread 
     workerThread.Abort(); 
    }