웹 서버의 데이터에 액세스하는 webserver.while에서 C# 및 데이터베이스를 사용하여 응용 프로그램을 만들고 있는데, 매우 느리고 폼이 또한 데이터가로드 될 때까지 중단됩니다. 먼저 양식을로드하고 나중에 데이터를로드하는 방법은 무엇입니까?데이터 독립적 인 UI로드 방법
1
A
답변
3
일반적인 문제 해결 방법은 BackgroundWorker
클래스를 사용하는 것입니다.
public void InitBackgroundWorker()
{
backgroundWorker.DoWork += YourLongRunningMethod;
backgroundWorker.RunWorkerCompleted += UpdateTheWholeUi;
backgroundWorker.WorkerSupportsCancellation = true; // optional
// these are also optional
backgroundWorker.WorkerReportsProgress = true;
backgroundWorker.ProgressChanged += UpdateProgressBar;
}
// This could be in a button click, or simply on form load
if (!backgroundWorker.IsBusy)
{
backgroundWorker.RunWorkerAsync(); // Start doing work on background thread
}
// ...
private void YourLongRunningMethod(object sender, DoWorkEventArgs e)
{
var worker = sender as BackgroundWorker;
if(worker != null)
{
// Do work here...
// possibly in a loop (easier to do checks below if you do)
// Optionally check (while doing work):
if (worker.CancellationPending == true)
{
e.Cancel = true;
break; // If you were in a loop, you could break out of it here...
}
else
{
// Optionally update
worker.ReportProgress(somePercentageAsInt);
}
e.Result = resultFromCalculations; // Supports any object type...
}
}
private void UpdateProgressBar(object sender, ProgressChangedEventArgs e)
{
int percent = e.ProgressPercentage;
// Todo: Update UI
}
private void UpdateTheWholeUi(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled)
{
// Todo: Update UI
}
else if (e.Error != null)
{
string errorMessage = e.Error.Message;
// Todo: Update UI
}
else
{
object result = e.Result;
// Todo: Cast the result to the correct object type,
// and update the UI
}
}
2
1
1
어떤 종류의 데이터를 사용하십니까? 멀티 스레딩은 당신을 위해 어려운 경우
2
을 당신은 BackgroundWorker에를 사용하거나 (당신이 webservivce를 호출 할 경우) 어떤 경우에는 비동기 방법이 있습니다, 당신은 처음에 데이터의 일부를로드 할 수 있습니다 양식에 단추를 넣어 사용자가 다른 부분의 데이터를 가져올 수있게하십시오. 일반적으로 주문형 로딩이라고하며 페이징이라고 불리는 방식으로 구현됩니다. 10000 개의 정보 기록이 있다고 상상해보십시오. 처음 100 개의 레코드를로드 한 다음 원하는 경우에만 두 번째 100 개의 레코드를로드 할 수 있습니다. 서버에서 오랜 시간 작업을하고 문제가 주문형 로딩이 아니라면 스레딩을 사용하는 것이 유일한 방법입니다.
관련 문제
- 1. 독립적 인 개인 세션
- 2. 독립적 인 더블 피커
- 3. UI로드 테스트
- 4. 플랫폼 독립적 인 키 코드 제공 방법
- 5. 파일을 터치하는 플랫폼에 독립적 인 방법?
- 6. 글꼴을 찾을 수있는 플랫폼 독립적 인 방법
- 7. 로케일 독립적 인 strtod 구현
- 8. IDE 독립적 인 수은 리포지토리
- 9. OS 독립적 인 C++ 스레딩?
- 10. 비주얼 스타일 독립적 인 드로잉
- 11. 플랫폼 독립적 인 수학 라이브러리
- 12. 플랫폼 독립적 인 이클립스 설정
- 13. 브라우저 독립적 인 읽기 전용?
- 14. bash와 독립적 인 프로세스 만들기
- 15. 언어 독립적 인 로직 질문
- 16. Joomla - 독립적 인 SQL 쿼리
- 17. 2 개의 독립적 인 데이터 소스를 하나의 트랜잭션으로 처리하십시오.
- 18. 사용자 독립적 인 세션 데이터 : Embperl 외부 어디서나 구현됩니까?
- 19. 데이타베이스 독립적 인 방법으로 필드 레벨에서 데이터 변경 통지를 받습니까?
- 20. 독립적 인 복제 TADODataSet을 달성하는 방법은 무엇입니까?
- 21. 플랫폼 독립적 인 방식으로 무한 값을 선택하는 방법
- 22. 좋은 방법 (및/또는 플랫폼에 독립적 인 장소) 웹
- 23. Silverlight UserControl에 대한 독립적 인 디스 퍼처 스레드를 스핀하는 방법
- 24. 파이썬 : PATH 환경 변수를 수정하는 플랫폼 독립적 인 방법
- 25. 독립적 인 소프트 dll을 사용하여 전자 메일을 전달하는 방법
- 26. 4 바이트 객체에 대한 포인터 얻기 구현 독립적 인 방법
- 27. URL 라우팅 디렉토리 독립적 인 웹 사이트를 유지하는 방법
- 28. asp.net에서 해상도 독립적 인 웹 사이트를 개발하는 방법
- 29. 플랫폼 독립적 인 퍼멀 링크 - 모범 사례?
- 30. 운영체제 독립적 인 장소에서 파이썬으로 설정 파일로드하기
닷넷 4, 당신은 또한 [TPL'Task' 클래스 (http://stackoverflow.com/questions/3513432/task-parallel-library-replacement-for-backgroundworker을 체크 아웃 할 수 있습니다) –