I am creating Windows Application in C# in which I want to write in multiple files with multiple threads. I am getting data from different ports and there is one file associated with every port. Is it possible that creation of thread for every port and use the same thread again and again for writing data to respective file? Suppose I am getting data from ports 10000,10001,10002 and there are three files as 10000.txt, 10001.txt and 10002.txt. I have to create three threads for writing data to these three files respectively and I want to use these threads again and again. Is it possible? Please can you give a small sample of code if possible?
问题:
回答1:
As mentioned in the comments, this is asking for trouble.
So, you need to have a thread-safe writer class:
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
This is suitable for being called by many threads. BUT, there's a caveat. There may well be lock contention. I used a ReadWriterLockSlim
class, because you may want to do read locks as well and hell, that class allows you to upgrade from a read state also.
回答2:
You answers to other posts are somewhat out-of-line with your original question - it seems you want to write to one different file per thread.
The easy answer is.. just do it - the file system is thread-safe. The only snag may be performance with only one disk. Concurrently and rapidly writing small chunks of data to many files may result in a lot of disk-thrashing as the file system tries to cope with the distributed files/directories with only one rotor arm. Modern hard disks with large caches and clever controllers will mitigate this to some extent, but you may have an issue. Try it and see!
Your problems will be increased if you plan to continually create and destroy threads, open and close data files for every incoming network read. If you can possibly avoid this, do so.
If the disk cannot keep up, you could implement some clever 'lazy-writing' algorithm of your own to increase the size of the disk writes and so reduce the number, or buy an SSD, or both.
回答3:
You'l need to serialize the threads and manage the closing and opening file calls. And probably use append instead of write.. You could use a thread manager class( more like the main thread) to helping syncing all your other threads. Though the best thing would probably be to use one thread dedicated for writing to that file..