2012-03-28 3 views
0

나는 the article on copying streams asynchronously을 읽습니다. 읽기/쓰기에는 단 하나의 버퍼 만 사용되고 있음을 발견했습니다.어디서 비동기 스트림 복사본을 얻을 수 있습니까?

비동기 호출을 사용하여 스트림 복사본을 만들면 나에게 뭔가가 발생합니까?

하나의 버퍼로 인해 런타임시 비동기식 솔루션이 매우 동기화 된 것처럼 보입니다. 쓰기는 읽기를 기다려야하고 다음 읽기는 버퍼가 쓰여질 때까지 대기해야합니다.

일부의 생각 : 내가 본

여러 버퍼를 사용하여 변형. IMHO는 물건을 더 복잡하게 만들고 더 많은 메모리를 사용하며 문제를 연기합니다. 여러 번 읽는 것과 동시에 쓰기를 확장 할 수 있습니다.

파일의 경우 필자는 쓰기에 더 편한 해결책을 상상할 수 있습니다. 모든 파일을 읽을 때 순서를 읽고 수정하면 블록을 작성합니다. (파일 시스템이이를 지원해야합니다).

.NET 3.5를 사용 중이므로 .NET 4 또는 4.5를 사용할 수 없기 때문에이 기사를 읽었습니다.

(마이크로 소프트 닷컴 ADRES 반송에서의 netqa)

답변

2

비동기 처리는 비 CPU 관련 대기 시간을 처리하고 미친 양의 스레드가없는 경우를 피할 때마다 도움이됩니다 (확장 성이 좋지 않습니다. 스레드 당 CPU 수가 너무 많아서는 안됩니다. "비싼"자원이므로 풍부한 컨텍스트 전환으로 인해 성능이 저하 될 수 있습니다.

따라서 디스크 및 네트워크 모두 데이터 처리에 필요한 컴퓨팅 노력에 비해 "속도가 느리기"때문에 일반적인 후원자는 IO 작업입니다. 따라서 많은 병렬 스트림 (네트워크 및 디스크)이있을 때마다 비동기 작업을 사용해야합니다.

그렇다면 적절한 비동기 프로그래밍은 어렵습니다. 특히 새로운 .NET 컴파일러에서 제대로 지원하지 않아도됩니다.

좋은 비동기 복사본은 적어도 2 개의 버퍼를 사용해야합니다. 하나는 데이터 읽기 (비동기)이고 다른 하나는 데이터 쓰기 (비동기)입니다. 물론 유휴 기록기는 판독기가 블록을 완료 한 후에 시작하며, 유휴 판독기는 최소한 여분의 버퍼 (예 : 기록기 작성이 완료된 경우)가 시작될 때만 시작됩니다. 하나의 버퍼 만 있으면 연속적인 읽기 및 쓰기 작업 사이에 중단이 있습니다 (예 : 읽기 + 쓰기, 읽기 + 쓰기, 쓰기 "대신 항상"읽기, 쓰기, 읽기, ... 쓰기 "가됩니다.

1

쓰기는 그것을 수행 물론

을 읽을 기다려야합니다. 아직 데이터를 읽지 않았다면 무엇을 쓸 것입니까?

다음 읽기는 버퍼가 기록 될 때까지 대기해야했습니다.

경우에 따라이를 피하는 것이 좋지만 프로필을 만들어야합니다. 다양한 캐시와 하드 디스크에서 데이터를 읽고 쓰는 방법은이 문제에 영향을 미칠 수 있습니다. 성능상의 이점이 있다면 그것은별로 크지 않을 것입니다.

는 비동기 호출이 내게 뭔가를 얻을 사용하여 스트림 사본을 수행 않습니다 당신의 주요 질문에 지금

?

IO는 IO가 발생하는 동안 어떤 스레드도 차단하지 않는다는 사실로부터 이득을 얻습니다. 스레드는 값 비싼 리소스이기 때문에 성능면에서 중요합니다 (특히 가상 메모리와 실제 메모리 모두 1MB 필요). 이것은 ASP.NET과 같은 환경에서 큰 차이를 만들 수 있습니다. 여기서 각 요청은 다른 스레드에 의해 처리됩니다.

몇 가지 파일 만 복사하는 데스크톱 응용 프로그램을 작성하는 경우 UI 스레드를 차단하지 않는 한 사용자에게 아무런 영향이 없습니다.

관련 문제