2010-01-25 3 views
1

다음은 내가 풀려고하는 것입니다 :BackgroundWorker는 AsyncOperationManager에 대한 좋은 대체물입니까?

내 수업 (UI 앱이나 Windows 서비스 등에서 호스팅 할 수 있음)은 Windows 메시지를 받아야합니다. 어딘가에 누군가가 제안서 (및 일부 소스 코드)를 작성하여 양식을 작성할 별도의 스레드에 Windows 양식을 작성하고 관심있는 Windows 메시지가 WndProc에서 수신 될 때마다 컨텍스트를 사용하여 위임을 트리거합니다 .게시하다.

나는 제대로 작동 시키려고했지만 실패했다. 그 애비뉴에 더 많은 시간을 소비하는 대신 내가 여기에 도움을 위해 게시 할 문제를 복제하기 전에 BackgroundWorker를 사용하여 동일한 솔루션을 구현하려고 할 것입니다.

내가했던 테스트에서 나는 UI를 사용할 때 꽤 잘 작동 할 것이라고 기대했지만 나의 질문은 UI를 다루지 않을 때 BackgroundWorker를 사용하는 것에 대한 조언이 있는가?

편집 : 내가 상상 해요 방법, 내 "아이"양식 (배경 노동자에서 실행되는 하나) 메시지를 수신 할 때마다, 나는 ReportProgress를 발급합니다. 스레드를 통해 전달해야하는 유일한 메시지 ID는 기술적으로 올바르게 충분해야합니다.

+0

백그라운드 워커에서 UI를 얼마나 자주 업데이트 하시겠습니까? – SwDevMan81

+0

나는 최대를 생각한다. 빈도는 5 초마다 약 1 회 있어야하지만 정상적인 경우는 2 ~ 10 분마다 한 번입니다. –

답변

1

BackgroundWorker와 창은 물과 불입니다. 창에는 STA 스레드와 메시지 루프가 필요하며 둘 다 BGW에서 제공하지 않습니다. 대안을 찾으려면 this thread에서 내 대답을 확인하십시오.

+0

매우 흥미 롭습니다. 원래 게시물에 질문을 남겼지 만, 어쨌든 여기에서 물어볼 것입니다. SynchronizationContext를 사용하기 시작한 이유는 호스트가 UI 레이어에 있어야 할 필요가 없으므로 Invoke를 호출 할 필요가 없다는 사실이었습니다. DeviceChangeNotifier의 클라이언트가 NT 서비스에서 실행되는 라이브러리 인 경우에도 모델을 사용할 수 있습니까? –

+0

이 코드는 다른 스레드로 이벤트 호출을 마샬링하기 위해 실제로 아무 것도하지 않으며, 백그라운드 스레드에서 발생합니다. 필요에 따라 직접 동기화를 추가해야합니다. 어떤 서비스에서 필요하지 않아야, 당신은 아무것도 동기화 할 수 없습니다. –

1

최대 5 초마다 메시지 번호 (userState)를 ReportProgress 이벤트로 전달하면됩니다.

+0

그리고 1 초마다 또는 100ms 단위로 말하면 왜 그렇지 않을까요? –

+0

UI가 응답하지 않으므로 http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/9ea431a7-588d-4452-a711-42e64338ac7e/ – SwDevMan81

+0

여기에 더 자세한 응답이 있습니다. http : //social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/ee8b2e1e-a614-41ce-8707-cc31215dd758/ – SwDevMan81

0

BackgroundWorker 개체는 수행하려는 작업을 수행하는 훌륭한 방법입니다. 그러나 간단한 메시지 ID는 코드를 작성할 때 더 이상 충분하지 않지만 BackgroundWorker.ReportProgress 메서드를 사용하면 상태 개체를 전달할 수 있습니다. 효율적인 상태 개체를 작성하면 철저히 스냅 샷을 보내서 부모 폼으로 다시보고 할 수 있습니다.

관련 문제