tôi đang tạo ứng dụng windows trong C#, trong đó tôi muốn viết trong nhiều tập tin với nhiều luồng. Tôi đang nhận dữ liệu từ các cổng khác nhau và có một tệp được liên kết với mỗi cổng. Có thể tạo chuỗi cho mọi cổng và sử dụng cùng một luồng lặp đi lặp lại để ghi dữ liệu vào tệp tương ứng? Giả sử tôi đang nhận dữ liệu từ các cổng 10000,10001,10002 và có ba tệp là 10000.txt, 10001.txt và 10002.txt. Tôi phải tạo ra ba chủ đề để ghi dữ liệu vào ba tập tin tương ứng và tôi muốn sử dụng các chủ đề này một lần nữa và again.Is nó có thể? Xin vui lòng bạn có thể đưa ra một mẫu nhỏ của mã nếu có thể?Làm thế nào để viết trong một tập tin với nhiều chủ đề?
Trả lời
Như đã đề cập trong phần nhận xét, đây là yêu cầu gặp sự cố.
Vì vậy, bạn cần phải có một lớp nhà văn thread-safe:
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
này thích hợp để được gọi bằng nhiều chủ đề. NHƯNG, có một báo trước. Cũng có thể có tranh chấp khóa. Tôi đã sử dụng một lớp học ReadWriterLockSlim
, bởi vì bạn có thể muốn đọc khóa cũng như địa ngục, lớp đó cho phép bạn nâng cấp từ trạng thái đọc.
Cảm ơn bạn đã phản hồi, tôi chỉ viết một phương pháp để ghi vào tệp và tôi chỉ chuyển các tham số khác nhau cho phương thức đó. Nhưng nếu tôi sử dụng LOCK cho phương thức viết thì chỉ có một luồng có thể truy cập phương thức đó. tôi. – Dany
@Dany, nhiều chủ đề cộng với + 1 tệp = tin xấu. Trường hợp sử dụng của bạn là gì? –
nhiều chủ đề cộng với + 1 tệp không phải là trường hợp của tôi. Trường hợp của tôi là nhiều chuỗi và nhiều tệp. – Dany
Bạn cần phải sắp xếp từng chuỗi chủ đề và quản lý cuộc gọi tệp mở và mở. Và có thể sử dụng phụ thêm thay vì viết .. Bạn có thể sử dụng một lớp trình quản lý chuỗi (giống như chủ đề chính) để giúp đồng bộ hóa tất cả các chủ đề khác của bạn. Mặc dù điều tốt nhất có thể là sử dụng một luồng dành riêng cho việc ghi vào tệp đó ..
Cảm ơn bạn đã trả lời nhưng tôi có thể tạo một chuỗi chuyên dụng cho một tệp cụ thể và một chuỗi khác không thread cho một tập tin và như vậy? – Dany
@Dany - Trừ khi bạn có một chuỗi luôn chạy cùng một chuỗi sẽ xử lý việc ghi vào bất kỳ tệp nào của bạn.Ngay cả câu trả lời được chấp nhận cũng sẽ không sinh ra một luồng mới để ghi vào tệp, chỉ ngăn chặn nhiều luồng, từ việc ghi vào cùng một tệp tại thời điểm đó. –
Bạn trả lời các bài đăng khác có phần không phù hợp với câu hỏi ban đầu của bạn - có vẻ như bạn muốn ghi vào một tệp khác nhau cho mỗi chuỗi.
Câu trả lời dễ dàng là .. chỉ cần làm điều đó - hệ thống tệp an toàn chỉ. Các snag chỉ có thể được thực hiện với chỉ một đĩa. Đồng thời và nhanh chóng viết các khối nhỏ dữ liệu vào nhiều tệp có thể dẫn đến nhiều sự cố đĩa vì hệ thống tệp cố gắng đối phó với các tệp/thư mục được phân phối chỉ với một cánh tay rôto. Đĩa cứng hiện đại với bộ đệm lớn và bộ điều khiển thông minh sẽ giảm thiểu mức độ này, nhưng bạn có thể gặp sự cố. Hãy thử nó và xem!
Sự cố của bạn sẽ tăng lên nếu bạn có kế hoạch liên tục tạo và hủy chuỗi, mở và đóng tệp dữ liệu cho mỗi mạng đến. Nếu bạn có thể tránh điều này, hãy làm như vậy.
Nếu đĩa không thể theo kịp, bạn có thể thực hiện một số thuật toán 'lười biếng' thông minh của riêng bạn để tăng kích thước của đĩa ghi và do đó giảm số lượng hoặc mua SSD hoặc cả hai.
- 1. Chủ đề và tập tin viết
- 2. Đọc một tập tin từ nhiều chủ đề trong python
- 3. Viết vào một tập tin từ nhiều chủ đề trong ruby
- 4. Nhiều chủ đề đọc từ cùng một tập tin
- 5. Làm thế nào để đối phó với nhiều chủ đề trong một lớp học?
- 6. Làm thế nào để viết một Mat phao vào một tập tin trong OpenCV
- 7. Soạn thảo tập tin với IO chồng lên nhau và ghi tập tin trong một chủ đề riêng biệt
- 8. Trong vim, làm thế nào để viết một phần dòng vào một tập tin?
- 9. Làm thế nào để mở một tập tin trong java
- 10. Làm thế nào để viết một biến vào tập tin trong kiến?
- 11. Làm thế nào để xóa nhiều tập tin cùng một lúc trong Bash trên Linux?
- 12. Làm thế nào để làm cho capistrano viết một tập tin .rvmrc khi triển khai?
- 13. Viết cho nhiều tập tin mô tả
- 14. Unix: Làm thế nào để xóa các tập tin được liệt kê trong một tập tin
- 15. FFmpeg Làm thế nào để viết đoạn video vào một tập tin
- 16. Hàng đợi tin nhắn an toàn với nhiều chủ đề
- 17. làm thế nào để làm cho một máy chủ socket nghe trên tập tin cục bộ
- 18. Viết một tập tin .htaccess trong PHP?
- 19. Làm thế nào để xem một tập tin viết bằng PHP?
- 20. Làm thế nào để thêm một cột từ một tập tin vào một tập tin
- 21. Mã tĩnh chạy với nhiều chủ đề như thế nào?
- 22. Làm thế nào để băm một tập tin duy nhất nhiều cách cùng một lúc?
- 23. Node.js làm thế nào để đọc một tập tin và sau đó viết cùng một tập tin với hai chức năng riêng biệt?
- 24. Làm thế nào để viết văn bản vào một tập tin văn bản bằng Photoshop JavaScript?
- 25. Làm thế nào để vẽ các tập tin với numpy?
- 26. làm thế nào để viết một thư mục [không chỉ các tập tin trong nó] vào một tập tin tar.gz trong golang
- 27. Làm thế nào để viết các số nguyên vào một tập tin
- 28. Làm thế nào để nhúng một tập tin vào một tập tin HTML?
- 29. nhiều chủ đề viết tới std :: cout hoặc std :: cerr
- 30. Làm thế nào để đọc một tập tin văn bản vào GNU R với một dấu phân cách nhiều byte?
bạn cần phải tuần tự hóa quyền truy cập tệp (ví dụ bằng Mutex hoặc tương tự) hoặc có một chuỗi trung tâm chịu trách nhiệm ghi tệp mà mọi chuỗi khác chỉ cho biết cần viết gì (xếp hàng công việc được thực hiện bởi chuỗi trung tâm đó) ... – Yahia
Tại sao bạn cần ghi vào một tệp duy nhất từ nhiều chuỗi? Đây là một ý tưởng tồi, không chỉ từ một đồng bộ hóa mà ngay cả các cơ chế ghi vào tập tin (khóa vv). – Oded
Ở đây tôi đang nhận dữ liệu từ các cổng khác nhau liên tục và có các tệp khác nhau. Ba là một tệp được liên kết với cổng duy nhất. Tôi muốn ghi dữ liệu đó từ cổng đến tệp tương ứng. Tôi muốn tạo luồng cho mọi dữ liệu đến, Nó sẽ ghi dữ liệu đó vào một tệp cụ thể và hủy bỏ nó và cứ thế. – Dany