데이터베이닝에서 대규모 알림을 피하는 방법
-
19-09-2019 - |
문제
데이터베인딩 시나리오에서는 상당히 일반적인 문제라고 생각합니다. 배치 업데이트를 실행 중이며 PropertyChanged-Dependend 계산/작업/모든 단일 업데이트마다 실행되는 것을 피하려면 일반적으로 무엇을합니까?
일반적으로 내 마음에 오는 첫 번째는 새로운 부울을 소개하거나 이벤트 핸들러를 훅/훅을 소개하는 것입니다.
이 접근법에 대해 내가 좋아하지 않는 것은 다음과 같습니다.
- 그들은 새로운 복잡성을 소개합니다 (유지해야합니다 ...)
- 억압 된 알림이 나중에 전송되도록해야하기 때문에 오류가 발생합니다.
누군가 가이 문제를 이미 더 편리한 방식으로 처리하기가 더 편리한 방식 으로이 문제를 해결했는지 궁금합니다.
티아 마틴
편집 : 나를 잘못 이해하지 마십시오. .NET가 BindingList의 RaisElistChangeDevents와 같이 제공하는 것들에 대해 알고 있습니다. 모두 내가 설명한 것과 동일한 방식으로 문제를 다루고 있지만 단점을 나열 할 필요가없는 다른 방법을 찾고 있습니다. . 어쩌면 나는 잘못된 길을 가고 있을지 모르지만 여기서 시도해 보지만 ...
해결책
불행히도 하나의 크기에 맞는 솔루션이 하나도 없습니다. 다음 솔루션을 적용하거나 보았습니다.
두 개의 노래가 있습니다. 하나의 신호는 사용자 조치에서 변경이 발생하면 다른 신호는 항상 발사됩니다. 이를 통해 UI의 변경 사항과 코드 별 업데이트를 구별 할 수 있습니다.
코드를 보호하는 부울
속성 이벤트 프레임 워크는 값이 실제로 변경되지 않은 경우 자동으로 전파 이벤트를 중지합니다.
신호 또는 신호 관리자의 동결/해동 메소드 (즉, 전체 프레임 워크)
신호를 하나의 신호로 병합하는 방법. 당신은 n 업데이트를 할 수 있고 m <= n의 m 신호로 수집됩니다. 동일한 속성을 100 번 변경하면 여전히 1 개의 신호 만 얻습니다.
신호 대기열 (동기 실행 대신). 그런 다음 대기열 코드도 신호를 병합 할 수 있습니다. "저장"버튼이없는 응용 프로그램에서 큰 성공을 거두었습니다. 모든 변경 사항은 데이터베이스를 작성할 때 데이터베이스에 저장됩니다. 텍스트를 변경하면 변경 사항이 특정 시간에 걸쳐 (즉, 이전 DB 업데이트가 반환 될 때까지) 병합 된 다음 단일 변경으로 커밋됩니다.
한 번에 여러 값을 설정하는 API; 단일 신호 만 방출됩니다.
신호 프레임 워크는 다른 수준의 세분성으로 신호를 보낼 수 있습니다. 이름이있는 사람이 있다고 가정 해 봅시다. 이름을 변경하면 이름 변경과 하나의 "인스턴스 필드 변경"이라는 두 가지 신호가 나타납니다. 따라서 "무언가가 변경되어있다"만 돌보면 모든 필드 대신 인스턴스에 연결할 수 있습니다.
다른 팁
어떤 플랫폼? 게시물은 내가 .NET를 생각하게 만듭니다.
기본 물체는 무엇입니까? 예를 들어, BindingList<T>
소스로서 설정하여 알림을 비활성화 할 수 있습니다. RaiseListChangedEvents
업데이트를 수행하는 동안 거짓으로.
그 외에 (또는 유사한); 예, 큰 업데이트 중에 바인딩을 분리하십시오
가장 쉬운 경로는 사용하는 것입니다 BindingSource
데이터 바인딩의 구성 요소. 컨트롤을 특정 물체 (또는 Ilist)에 바인딩하는 대신 해당 객체를 사용하십시오. DataSource
용 BindingSource
, 그런 다음 컨트롤을 BindingSource
.
그만큼 BindingSource
수업은 있습니다 SuspendBinding()
그리고 ResumeBinding()
기능.