2013-04-13 2 views
2

저는 모든 사람이 Visual Studio를 사용하여 데이터 바인딩 된 컨트롤에 데이터를 채우는 전통적인 방법에 익숙하다고 생각합니다.강력하게 형식화 된 데이터 집합을 비동기 적으로 채우기

this.applications_infoTableAdapter.Fill(this.bITSS_UIT_dBDataSet_tmpApplication.Applications_info, textBox1.Text); 

모든 것이 완벽하게 작동 데이타베이스로부터 꺼낼 수있는 데이터의 부하가있는 경우를 제외하고 다음 VS는 강력하게 데이터 집합을 입력하고 코드가 아래처럼 폼로드 이벤트에 대한 데이터 어댑터의 채우기 함수를 호출 생성 .

데이터베이스에 500,000 개 이상의 튜플이 있고 서버 측에서 검색해야 할 경우 SQL Server조차도 데이터를 반환하는 데 약간의 시간이 걸립니다. 이 기간 동안 Windows 양식의 UI가 응답하지 않게됩니다.

많은 양의 데이터의 경우 UI는 상당한 시간 동안 응답하지 않아 받아 들일 수 없습니다.

내 질문은, 데이터를 채우는 비동기 방식으로 UI가 응답을 유지하고 우리가 원하는 애니메이션이나 다른 것을 사용자에게 보여줄 수 있다는 것입니다.

나는 분명히했으면한다.

답변

2

입력 된 데이터 집합에 비동기식 채우기가 없습니다. 쿼리는 데이터베이스가 아니라 코드에서 실행됩니다. 데이터베이스 엔진은 여러 코어를 사용하여 쿼리를 수행 할 수 있지만 쿼리가 완료되고 결과가 유선을 통해 다시 전송 될 때만 채우기 호출이 반환됩니다. BeginLoadData를 통해 데이터 테이블의 부기를 해제 할 수 있지만 데이터베이스 서버가 쿼리를 처리하는 방식은 변경되지 않습니다.

서버가 SQL Server 인 경우 async = true가 설정된 SqlConnection async를 사용할 수 있지만 형식화 된 데이터 집합은 SQL Server 공급자를 사용하는 코드를 생성하지 않으므로 디자이너 생성 코드를 패치해야합니다 일반 SQL 서버 객체 대신 SQL 서버 객체를 사용합니다.

더 쉬운 방법은 System.Threading, Background Worker 또는 PPL을 통해 백그라운드 스레드에 테이블 어댑터 작성 및 채우기를 수행하여 다른 스레드를 중단시키는 것입니다. 데이터 채우기를 일시 중지하거나 다시 시작하려면 페이징을 지원하도록 쿼리를 다시 작성해야합니다.

+0

그게 뭐죠? C# 4 또는 5에는이 기능이 없습니다. –

+1

당신은 언어가 할 수있는 것을 오해했습니다. 언어는 코딩 관례이며 말할 행동 코드가 없습니다. 다른 사람이 작성한 코드의 동작을 변경하는 데는 사용할 수 없습니다. 테이블 어댑터를 생성하고 System.Threading, WinForms BackgroundWorker 또는 PPL을 통해 백그라운드 스레드로 데이터베이스를 쿼리하는 코드를 이동할 수 있습니다. 그러나 이것은 C#이 제공하는 것과는 아무런 관련이 없습니다. –

+0

자세한 답변을 보내 주셔서 감사합니다. 나는 우리가 코딩하지 않으면 언어가 스스로를 말할 수 없다는 것을 이해한다. 내가 뭘 물어 보니, 거기에 UI에서 스레드가 반응을 유지하면서 DB에서 데이터를 가져올 수있는 방법입니다. MultiThreading 또는 BackgroundWorker를 사용하여 동일한 작업을 수행 할 수 있다는 것을 알고 있지만 UI 응답 성을 유지하면서 강력한 형식의 DS를 채울 수있는 해결 방법이 있는지 알고 싶습니까? –

관련 문제