2014-01-23 1 views
0

미안하지만 바보 같은 질문이라면 C#을 처음 사용합니다. 잠시만 기다려주십시오.스레딩하지 않고 루프를 멈추십시오 C#

저는 Revit API를 작업하고 있습니다. 현재 Revit API는 멀티 스레딩 작업을 지원하지 않습니다. 내 질문에 새 스레드를 호출하지 않고 루프를 중지하는 방법입니까?

은 내가 스냅 샷을 얻을 수 트링 그리고 난 스냅을 선택하는 사용자를 위해 기다리는 것 같은데하고, 그래서 조건이

while (!Clipboard.ContainsImage()) //loop till user get a clipboard image 
       { 

       } 

하지만 난이 중단하려는 경우에 부합까지 내가 infinit 루프를 넣어 ?? ? 내가

private void Abort_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Escape) 
     { 
      abort = true; 
     } 
    } 

을 시도했지만이 방법은 .... 어떤 제안 스레딩이 필요합니다!

+1

'break'명령을 사용하여 while 루프를 빠져 나올 수 있습니다. –

+1

당신은 그'! Clipboard.ContainsImage()'로 당신의 CPU 부하를 살펴 봤습니까? 그건 좋은 생각이 아닙니다! – TGlatzer

+4

절대로 ** 절대로 ** while 루프를 사용하여 작업이 완료 될 때까지 기다려주십시오. – RononDex

답변

0

Revit에서 비동기 처리 패턴을 조사하려면 The Building Coders description of IExternalEvent을 확인하십시오.

그것은 그 주위에 당신의 머리를 정리하기 위해 약간의 시간이 걸릴하지만 나에게 설명하려고 할 수 있습니다

두 부분으로 코드를 분할은 : 순간 당신이 선택하는 사용자에게까지 첫 번째 부분은 실행합니다 스냅 (다른 응용 프로그램에서이 문제가 발생한다고 가정합니다). 별도의 스레드에서 while 루프의 클립 보드 (또는 register your application as a clipboard viewer)를 폴링합니다. 폴링 중에 Sleep()을 잊지 마세요! 폴링 스레드가 그림을 찾으면 즉시 서브 클래스 IExternalEvent의 인스턴스를 만들어 Revit에 게시합니다. Revit에 여유 시간이 있으면 나머지 코드를 수행하는 데 사용할 수있는 UIApplication을 전달하여 Execute 메소드를 실행합니다.

Revit에서 당신이 동시에에서 여러 스레드 에서 API의 액세스 허용하지 않습니다하지만 IExternalEvent 서브 클래스의 Execute 방법 동안, 당신은 코드를 실행하기위한 올바른 스레드에서 보장된다.

OnIdling 이벤트를 볼 수도 있습니다. 기본적으로 Revit에는 여유 시간이있을 때마다 호출됩니다. 따라서 별도의 스레드에서 while 루프를 사용하는 대신 OnIdling 이벤트의 이벤트 처리기에 클립 보드 검사 코드를 넣고 현재 스냅을 기다리고 있음을 알려주는 메커니즘 (플래그)을 만들면됩니다. ..

관련 문제