1

나는 문제가 나는 것들이 시간이 걸릴 수 있습니다 다른 장소의 무리에 대처하는 방법을 가장 잘 알고 없다는 것입니다 서버 (데이터베이스 또는 인터넷 중 하나)에서 데이터를 기다리는 동안 정지 할 가능성이있는 응용 프로그램을 설계하고있다. 백그라운드 스레드에서 모든 것을 실행해야합니까?

나는 접근이 일어나고있는 동안 사용자에게 '로드'대화 상자를 표시하는 행복하지만, 이상적으로 나는 위로 쓸어 및 단기 실행 작업에 사라 이것을 원하지 않는다.

마이크로 소프트 워드는 당신이 버튼을 클릭하는 것처럼, 아주 능숙하게이 문제를 처리하기 위해 나타나고 작업이 몇 초 후에 당신이 '작업 ...'대화 상자를 얻을, 시간이 오래 걸립니다. 작업은 여전히 ​​동기식이므로 작업을 중단 할 수 없습니다. 그러나 동일한 작업이 빠르게 발생하면 분명히 대화 상자가 표시되지 않습니다.

몇 가지 일반 배경 작업자 스레드 처리기를 고안해 내 데이터 처리의 99 %가 정적 원자 방법으로 이미 완료되었습니다. 가능하면 최선의 방법을 찾고 싶습니다. 사람이 패턴, 코드 또는 제안이있는 경우

나는 그들에게 모든

건배를 환영

이상적으로

답변

1

마이크로 소프트 워드는 당신이 버튼을 클릭하는 것처럼, 아주 능숙하게이 문제를 처리하기 위해 나타나고 작업이 몇 초 후에 당신이 '작업 ...'대화 상자를 얻을, 시간이 오래 걸립니다. 작업은 여전히 ​​동기식이므로 작업을 중단 할 수 없습니다. 그러나 동일한 작업이 빠르게 발생하면 분명히 대화 상자가 표시되지 않습니다. 당신은 BackgroundWorker에 주변의 클래스를 포장하여 매우 쉽게이 문제를 해결할 수

이 행동 당신의 희망이 있다면 .... DoWork 이벤트의 시작 시간과 첫 번째 진행 보고서 시간. 일정 시간이 경과하면 대화 상자를 표시 할 수 있습니다. 그렇지 않으면 짧은 프로세스이므로 차단합니다. 말했다되고 그건

, 비동기 적으로 처리 할 수있는 당신이 일을하고 언제, 나는 그런 식으로 일을 권하고 싶습니다. 눈에 띄지 않는 간격에도 UI를 차단하지 않는 것이 훨씬 낫습니다. task parallel library을 사용하면 .NET 4 (또는 Rx 프레임 워크가있는 3.5)에서 훨씬 간단 해집니다.

+0

어떻게 당신을 제외하고 말을 다른이 추가 스레드의 오버 헤드를 가지고있다? –

+0

@ 환불 없음 반환 값 : "추가 스레드의 오버 헤드"가 없습니다. 차이점은 접근법에있었습니다. 나는 이것을 처리하기 위해 주 스레드에 타이머가없는 다른 옵션을 주었다. 비동기 메서드 호출은 별도의 스레드에서 수행되므로 솔루션에 별도의 스레드가 필요합니다. 또한 비동기 처리를 위해 TPL에서 작업 을 살펴볼 것을 제안했습니다. –

+0

그래도 비동기 코드가 있으면 OS가 대신 스레드를 관리합니다. 귀하의 접근 방식은 개발자를위한 더 많은 작업이며 오류가 발생할 여지가 많습니다. –

0

당신도 비동기 적으로 백그라운드 스레드에서 또는 IO 또는 비 UI 처리를 실행해야하는 UI를 잠금 방지하기 위해 .

3

은 확실히이 이벤트와 패턴을 사용하여 비동기 적으로 생각하는 것입니다. 첫 번째 "이벤트"는 실제로 어디서나/기다릴 때마다 데이터를 가져온 것입니다. 두 번째 이벤트는 지연 타이머입니다. 이 타이머가 터지기 전에 데이터를 얻으면 모든 것이 잘되고 잘됩니다. 그렇지 않다면 "바쁘다"라는 메시지가 뜨면 요청을 취소 할 수 있습니다. 일반적으로 응답을 마침내 취소하면 "무시"를 의미합니다.

관련 문제