2009-12-04 6 views
0

이것은 데이터 송수신시 일부 비동기 작업이있는 라이브러리에서받는 데이터에 "문제"가 있습니다. 데이터를 수신하고 모바일 Windows Form 또는 Desktop에서 데이터를받는 동안 크로스 스레드 작업을 처리해야합니다. 이 InvokeRequired 검사하는 동안 거래 및 등 ... 사실 ... 만약 내가 정말 원하는 것입니다이 사라지게하고 내 데이터를 올바르게 얻을 수 있도록 바인딩 할 수있는 등이 크로스 스레드 처리하지 않고 조작 할 수 있습니다. 문제.비동기 작업에서 메인 스레드로 데이터 가져 오기

질문 : 어떻게 내 라이브러리에 데이터를 조작 한 다음 클라이언트에 이벤트를 발생시킬 수 있습니까? 그들은 스레드 핸들링을 처리하지 않고 원하는대로 할 수 있습니다.

Compact Framework의 경우 클라이언트가 모바일 클라이언트이기 때문에 유효해야합니다. 따라서 ISynchronizeInvoke를 사용하여 찾은 솔루션이 유효하지 않습니다.

감사합니다. 미리 감사드립니다.

답변

1

라이브러리 생성자에서 COntrol을 만든 다음 Invoke를 사용하여 을 호출 한 후을 호출 할 수 있습니다. 그런 다음 사용자는 라이브러리 클래스를 만든 스레드의 컨텍스트에서 이벤트를 가져옵니다. Component를 Component로 만들면 UI 스레드에서 만들어 지므로 UI ​​스레드에서 이벤트가 발생합니다. 예를 들어 EDIT 1

:

private Control m_invoker = new Control(); 
public event EventHandler MyEvent; 

private void RaiseMyEvent(object o, EventArgs args) 
{ 
    EventHandler handler = MyEvent; 
    if (handler == null) return; 

    if (m_invoker.InvokeRequired) 
    { 
     m_invoker.BeginInvoke(new EventHandler(RaiseMyEvent), 
           new object[] { o, args }); 
     return; 
    } 

    handler(o, args); 
} 

그래서 코드가 다음 턴에 현재 개체를 만드는 스레드에 대한 호출을 마이그레이션 RaiseMyEvent를 호출 할 실제 이벤트가 발생 .

+0

삭제 된 이전 댓글, 내 나쁜 ... 이건 작동하는 것처럼 보입니다. 탄력 ... 지금 완전히 적용 할 것입니다. –

+0

사용자 지정 개체가 있고 제어를 통해 안전하게 작업 할 수있는 경우 호출 방법에 대한 예제를 만들 수 있습니까? 왜냐하면 나는 그것이 작동하도록 만들 수 있었지만 지금은 액션으로 호출하고 이벤트를 전달해야합니다. –

+0

라이브러리가 배경 스레드에서 생성되어 작동을 멈추는 것처럼 이것은 끔찍한 일입니다. 그러나, 이것이 정확히 내 libs의 일부 (SetSystemPowerState를 메인 스레드가 아닌 경우 일시 중단하도록 호출하면 중단되는 부분)에서 발생하므로 ..... 아마도 가장 좋은 해결책 일 것입니다. : – Quibblesome