2011-11-07 23 views
12

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ủ đề?

+4

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

+3

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

+0

Ở đâ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

Trả lời

10

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.

+0

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

+0

@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ì? –

+0

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

0

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 đó ..

+0

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

+0

@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 đó. –

3

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.

Các vấn đề liên quan