2009-04-19 4 views
1

웹 페이지 인덱싱 프로그램을 작동시키는 데 문제가 있습니다. URL을 데이터베이스 서버에서 자동으로 다운로드하여 UDP를 통해 색인 된 페이지 정보가 포함 된 응답을 다시 보내는 양식이 있습니다. 들어오는 메시지와 나가는 메시지를 추적하는 UDP라는 정적 클래스가 있습니다. 메시지가 수신 될 때마다 발생하는 이벤트가 있습니다.이 이벤트는 URL 인덱싱 데이터베이스를 보유하고있는 서버의 프로그램에서 보낸 메시지를 추적하기 위해 모든 인덱싱 코드 훅을 포함합니다.이벤트 처리기가 작성된 스레드와 별도의 스레드에서 호출되도록하려면 어떻게해야합니까?

색인 생성 양식 앞에 나타나는 다른 양식을 추가 할 때까지이 모든 작업이 정상적으로 수행되었습니다. 이제 색인 작성 양식이 다른 스레드에서 열립니다 (Application.Run() 및 두 번째 스레드를 통해). 문제는 이벤트가 발생할 때 이벤트 핸들러가 더 이상 호출되지 않는다는 것입니다.

그래서 여기에 무슨 일이 일어나고 있으며 문제를 해결하려면 어떻게해야합니까? 나는 이벤트가 발생 된 것보다 다른 스레드에서 이벤트 핸들러를 호출하지 않는 일부 크로스 스레드 안전 메커니즘과 관련이 있다고 확신한다. 아무도이 일을하는 다른 방법이나 이것을 우회하는 방법을 알고 있습니까? 미리 감사드립니다 ...

답변

3

UI 컨트롤은 UI 스레드에서 생성 된 스레드에서 조작해야합니다. 이를 달성하려면 이벤트 핸들러를 '호출'해야합니다. 당신은 또한 AsyncOperation & AsyncOperationManager 클래스를 살펴 가질 수

EventHandler handler = myEventHandler; 
if(handler != null) 
{ 
    ISynchronizeInvoke target = handler.Target as ISynchronizeInvoke; 

    if(target != null && target.InvokeRequired) 
    { 
     target.Invoke (handler, ...); 
    } 
    else 
    { 
     handler.DynamicInvoke (...); 
    } 
} 

을 또는 :

이 같은 이벤트를 발생하여 수행 할 수 있습니다.

아니면 더 간단 할지라도 SynchronizationContext 클래스를 살펴보십시오. 이 클래스의 'Current'속성을 사용하면 이벤트 핸들러를 감싸는 SendOrPostCallback 델리게이트를 게시 할 수 있습니다.

+0

일반적으로 DynamicInvoke를 사용할 필요는 없습니다. 단지 여기에서 호출하십시오.또한 * target *이 이렇게하는 것이 더 일반적입니다 ... –

0

나는 이것이 "안전 장치"라고 생각하지 않습니다. 디버거에 있고 해당 스레드가 아닌 다른 스레드에서 UI에 액세스하려고하면 이 WinForms (.NET 2.0 이상)에있는 안전 메커니즘이 예외를 throw합니다.

은 (는)으로 이벤트가 호출되지 않았습니까? 그것은 매우 이상하게 들린다. 디버거의 이벤트 처리기에 중단 점을 넣으면 해당 중단 점에 충돌이 발생하지 않습니까?

다른 방법으로 질문에 대답하려면 특정 스레드에서 전체 이벤트 처리기를 실행하지 마십시오. 가입 된 하나 이상의 핸들러가있을 수 있으며, 그 핸들러는 다른 스레드에서 실행해야 할 수도 있습니다. 대신 이벤트 처리기 자체를 스레드 안전성으로 지정하여 특정 스레드에서 어떤 작업을 수행해야 할 경우 해당 스레드로 다시 정렬합니다 (예 : Control.BeginInvoke 등).

대부분의 네트워크 액세스는 어떤 스레드에서 발생합니까? 이 아니거나 UI 스레드가 포함 된이 없기를 바랍니다. 그렇지 않으면 응답이없는 UI가 표시 될 수 있습니다. 그것은 이전에 작동했다면 아마 이미 적절한 마샬링을하고있을 것입니다. 매우 이상합니다.

이 중 아무 것도 도움이되지 않는다면 문제를 보여주는 짧지 만 완전한 프로그램을 만들 수 있습니까? 구체적인 코드를 진단하는 것이 더 쉽습니다.

관련 문제