2010-07-23 4 views
1

이것은 꽤 일반적인 작업 인 것처럼 보이지만 답변을 찾는 행운을 얻지는 못합니다.DLL에서 WPF GUI 업데이트

데이터베이스 루틴에 대한 DLL에 많이 의존하는 WPF/C# 응용 프로그램이 있습니다. dll이 일부 GUI 요소, 즉 진행률 표시 줄을 업데이트하려고합니다.

지금까지 답변은 System.ComponentModel 어딘가에 있으며 배경 작업자를 만드는 것으로 보입니다. 그러나 그것은 내가 얻을 수있는 한도 내입니다.

누군가이 작업을 수행하는 방법에 대한 제안을 제공해 줄 수 있습니까? 링크, 샘플 코드, 고무 된 단어를 높이 평가! Task 객체 (나는 개인적으로 Task를 선호)하는 것처럼

많은 감사,

제리

+0

의견을 통해 빠른 드라이브로서 WPF의 Dispatcher를 살펴보십시오. Dispatcher 클래스는 WPF의 메시지 펌프에 대한 게이트웨이를 제공하며 UI 스레드가 처리 할 작업을 라우팅하는 메커니즘을 제공합니다. http://msdn.microsoft.com/en-us/magazine/cc163328.aspx –

답변

3

데이터베이스 DLL을 호출 할 때 UI가 콜백 함수를 전달하도록 설정하는 것이 가장 좋습니다. 데이터베이스 DLL은 해당 콜백을 "주기적으로"호출하고 UI에 구현 된 콜백은 UI 요소를 업데이트합니다.

데이터베이스 DLL을 UI로 처리하지 않는 것이 가장 좋습니다. 한 가지 사실은 DLL이 다른 EXE에서 DLL을 사용할 수 없을 정도로 UI의 특성에 크게 의존한다는 것입니다.

+0

우려, 나중에 응용 프로그램에서 DLL의 재사용. 나는 충분히 일반적인 것을 만들려고했다. 그러나 콜백 함수에 대한 여러분의 생각을 좋아합니다. –

0

BackgroundWorker는 작동합니다. 내 블로그에는 취소 작업과 점진적인 진행에 대한 전폭적 인 지원과 함께 배경 작업을 수행하는 an example이 있습니다. 이 정도의 복잡성 (예 : 취소)이 필요하지 않을 수 있습니다.

1

코드가 어떻게 작동하는지 정확하게 말하면 약간 어렵습니다. 현재 구현이 UI를 (즉, DB DLL에 대한 동기 호출을 통해) 차단하는지 여부에 따라 응답이 달라집니다.

DLL에 대한 호출이 동기식이며 UI가 차단되면 예를 들어 BackgroundWorker를 사용하여 메인 UI 스레드가 정지하지 않도록 할 수 있습니다. 몇 가지 대답은 How do I implement a progress bar in C#?을 참조하십시오.

그러나 DB 호출의 진행 상황을 알기위한 몇 가지 메커니즘이 필요하며 DLL에서 아직 그와 같은 것을 노출하지 못하는 것 같습니다.

그냥 질문 라인 사이에서 읽고, 당신은 DLL을 수정할 수있는 능력을 가지고있는 것 같습니다. 그렇다면 진행 정보를 제공 할 때 DLL과 UI 앱 간의 분리를 유지하는 패턴을 사용해야합니다. UI 코드는 DLL이 느슨하게 결합 된 방식으로 제공 할 수있는 일부 데이터를 기반으로 자체를 업데이트하기 위해 실제로 응답해야합니다. 내가 사용하는 것이 좋습니다 것 중 하나

  • DLL의 일부 클래스에 의해 발표 이벤트에서 수신하여 구독 모델; 또는
  • 정기적으로 기반 (예 : 타이머 틱 처리기)에서 DLL에 구현 된 일부 데이터 객체를 모니터하는 폴링 모델 .

어느 방법이든간에, DLL을 코딩하여 두 레이어를 밀접하게 연결하지 않도록하고 싶다면 UI 레이어에 대해 잘 알고 있어야합니다.앞서 언급 한 두 가지 가능성은 대부분의 상황에서 앱의 기본 UI 스레드에서 UI 업데이트 코드를 유지하도록 허용해야합니다. 이는 멀티 스레딩 문제를 피하려면 중요합니다.

+0

네가 맞아, 나는 dll을 저술했다. 귀하의 제안도 도움이됩니다. 답장을 보내 주셔서 감사합니다! –