나는 여러 스레드에서 여러 파일을 쓰고 싶은 C#에서 Windows 응용 프로그램을 만들고 있습니다. 다른 포트에서 데이터를 가져 오는 중이며 모든 포트와 관련된 파일이 하나 있습니다. 모든 포트에 대해 스레드 생성이 가능합니다. 각각의 파일에 데이터를 쓰는 데 동일한 스레드를 반복해서 사용합니까? 포트 100001000110002에서 데이터를 가져 오는 중이며 10000.txt, 10001.txt 및 10002.txt와 같은 세 개의 파일이 있다고 가정합니다. 이 세 파일에 각각 데이터를 쓰는 데 쓰레드 세 개를 만들어야하고이 쓰레드를 반복해서 사용하고 싶습니다. 가능합니까? 가능한 경우 작은 샘플 코드를 제공 할 수 있습니까?여러 스레드로 단일 파일을 작성하는 방법은 무엇입니까?
답변
주석에서 언급했듯이, 이것은 문제를 요구하고 있습니다.
public class FileWriter
{
private ReaderWriterLockSlim lock_ = new ReaderWriterLockSlim();
public void WriteData(/*....whatever */)
{
lock_.EnterWriteLock();
try
{
// write your data here
}
finally
{
lock_.ExitWriteLock();
}
}
} // eo class FileWriter
이 많은 스레드에 의해 호출되는 적합 :
그래서, 당신은 스레드 안전 작가 클래스가 있어야합니다. 하지만 경고가 있습니다. 자물쇠 경합이있을 수 있습니다. ReadWriterLockSlim
클래스를 사용했기 때문에 읽기 잠금을 수행하고 싶을 수도 있고 지옥 클래스를 사용하면 읽기 상태에서도 업그레이드 할 수 있습니다.
스레드를 직렬화하고 닫고 열기 파일 호출을 관리해야합니다. 쓰기 대신에 append를 사용하십시오. (다른 스레드와 마찬가지로) 스레드 관리자 클래스를 사용하여 다른 모든 스레드를 동기화 할 수 있습니다. 아마도 가장 좋은 것은 파일에 쓰는 데 쓰이는 하나의 쓰레드를 사용하는 것이지만 ..
응답 해 주셔서 감사합니다. 그러나 특정 파일 하나에 대해 하나의 전용 스레드를 만들 수 있습니까? 다른 파일을위한 스레드 등등? – Dany
@Dany - 항상 같은 스레드를 실행중인 스레드가 없다면 어떤 파일에 대해서도 writting을 처리 할 것입니다.허용 된 대답조차도 파일에 쓰는 새 스레드를 생성하지 않고 여러 스레드가 sametime에서 동일한 파일로 쓰기를 막지 않도록합니다. –
다른 게시물에 대한 답변은 원래 질문과 다소 일치하지 않습니다. 스레드 당 하나의 다른 파일에 글을 쓰고 싶습니다.
쉬운 대답은 .. 그냥 해보세요. 파일 시스템은 스레드로부터 안전합니다. 유일한 장애물은 하나의 디스크로 성능이있을 수 있습니다. 작은 파일을 여러 파일에 동시에 빠르게 작성하면 파일 시스템이 하나의 로터 암만있는 분산 파일/디렉토리를 처리 할 때 많은 디스크 스 래싱이 발생할 수 있습니다. 대형 캐시 및 영리한 컨트롤러가있는 최신 하드 디스크는 어느 정도 이것을 완화 할 수 있지만 문제가있을 수 있습니다. 그것을 시도하고 볼!
지속적으로 스레드를 만들고 파괴하고 들어오는 모든 네트워크 읽기에 대한 데이터 파일을 열고 닫으려는 경우 문제가 증가합니다. 이것을 피할 수 있다면 그렇게하십시오.
디스크가 유지할 수없는 경우 디스크 쓰기 크기를 늘리고 숫자를 줄이거 나 SSD를 구매하거나 두 가지 모두를 수행 할 수있는 독창적 인 '지연 기록'알고리즘을 구현할 수 있습니다.
- 1. 여러 스레드로 여러 파일을 작성하는 방법은 무엇입니까?
- 2. 여러 스레드로 파일을 다운로드하는 방법
- 3. WinInet을 여러 스레드로 올바르게 연결하는 방법은 무엇입니까?
- 4. XML 파일을 작성하는 방법은 무엇입니까?
- 5. 특정 URL을 단일 스레드로 제한
- 6. 여러 스레드로 ffmpeg 실행
- 7. 단일 스레드로 TCP를 통해 전이중 채널을 구현하는 방법은 무엇입니까?
- 8. 파일을 작성하는 가장 효율적인 방법은 무엇입니까?
- 9. 하나의 NSData 객체에서 여러 파일을 작성하는 방법은 무엇입니까?
- 10. 쿼리 결과에서 SQL로 여러 파일을 작성하는 방법은 무엇입니까?
- 11. 버트 보고서 속성 파일을 작성하는 방법은 무엇입니까?
- 12. Zend_Config_Writer_Xml을 사용하여 여러 항목을 작성하는 방법은 무엇입니까?
- 13. 파일을 멀티 스레드로 정렬
- 14. 단일 xul에서 여러 dtd 파일을 사용하는 방법은 무엇입니까?
- 15. C#에서 멀티 스레드로 단일 파일을 다운로드하는 방법
- 16. C#에서 여러 개의 다운로드 스레드로 단일 UI 스레드를 업데이트하는 방법은 무엇입니까?
- 17. 루틴을 스레드로 분할하는 방법은 무엇입니까?
- 18. 여러 유형을 허용하는 함수를 작성하는 방법은 무엇입니까?
- 19. 여러 사용 지침을 작성하는 방법은 무엇입니까?
- 20. 여러 키에서 캐시 키를 작성하는 방법은 무엇입니까?
- 21. 여러 요소로 확장되는 템플릿을 작성하는 방법은 무엇입니까?
- 22. 초기 YAML 파일을 작성하는 방법은 무엇입니까?
- 23. 위치를받은 후 텍스트 파일을 작성하는 방법은 무엇입니까?
- 24. PHP를 사용하여 js 파일을 작성하는 방법은 무엇입니까?
- 25. netcdf 파일에서 이진 파일을 작성하는 방법은 무엇입니까?
- 26. xml 데이터베이스 파일을 효율적으로 작성하는 방법은 무엇입니까?
- 27. 파이썬으로 csv 파일을 작성하는 방법은 무엇입니까?
- 28. .csv 파일을 함수에서 작성하는 방법은 무엇입니까?
- 29. 서블릿에서 텍스트 파일을 작성하거나 작성하는 방법은 무엇입니까?
- 30. 런타임에 함수를 수정 한 다음 여러 스레드로 전파하는 방법은 무엇입니까?
파일 액세스를 직렬화하거나 (예 : 뮤텍스 또는 이와 유사한 방식으로) 하나의 중앙 스레드가 파일을 쓰도록해야합니다. 다른 모든 스레드가 무엇을 쓸 것인지를 말합니다 (중앙 스레드가 수행 할 작업 대기열에 넣기).) ... – Yahia
왜 여러 스레드에서 하나의 파일에 쓸 필요가 있습니까? 이는 동기화뿐만 아니라 파일 작성 (잠금 등)의 메커니즘까지도 나쁜 아이디어입니다. – Oded
여기에 내가 다른 포트에서 지속적으로 데이터를 가져오고 거기에 다른 files.Three 하나의 포트와 관련된 하나의 파일입니다. 나는 각 파일에 해당 포트에서 오는 데이터를 쓰고 싶습니다. 나는 모든 들어오는 데이터에 대한 스레드를 만들고 싶어, 그것 해당 데이터를 특정 파일에 쓰고 중단합니다. – Dany