2011-11-07 90 views
-1

我在C#中创建Windows应用程序,我想在多个文件中写入多个线程。我从不同端口获取数据,并且每个端口都有一个文件关联。是否有可能为每个端口创建线程并一次又一次地使用相同的线程来写入数据到相应的文件?假设我从端口10000,10001,10002获取数据,并且有三个文件,分别为10000.txt,10001.txt和10002.txt。我必须创建三个线程分别将数据写入这三个文件,并且我想一次又一次地使用这些线程。是否有可能?如果可能,请给出一小段代码示例?如何用多个线程写入多个文件?

+0

EXACT,字符重复的http://stackoverflow.com/q/8035029/331508,除标题。 –

回答

2

如果你让每个线程处理它自己的文件,它会做什么?

因此,当创建端口读取器线程时,您将打开属于该端口的文件,并将该句柄存储到该文件。当你接收数据,其写入文件:

class PortReader 
{ 
    StreamWriter _writer; 
    int _port; 
    YourPort _myPort; 

    public PortReader(int port) 
    { 
     // Do your port initialization stuff 

     _writer = new StreamWriter(port + ".txt"); 
    } 

    private void DataReceived(String data) 
    { 
     _writer.WriteLine(data); 
    } 

    public void StartReading() 
    { 
     while (_myPort.Connected) 
     { 
      // Do your port reading stuff 
      String data = _myPort.ReadData(); 

      // Do some processing with the data 

      // And now let it be written to the file 
      DataReceived(data); 
     } 
    } 
} 

然后像这样启动:

List<PortReader> readerList = new List<PortReader>(); 

readerList.Add(new PortReader(10000)); 
readerList.Add(new PortReader(10001)); 
readerList.Add(new PortReader(10002)); 
// etc... 

foreach (PortReader reader in readerList) 
{ 
    new Thread(new ThreadStart(reader.StartReading)).Start(); 
} 

理想情况下,你希望将文件从端口阅读写作分开,但我会为了简单起见,请留给你。

+0

我不明白这是如何重用线程......你没有循环。 – Tudor

+0

我认为OP不需要重用线程。那是什么用途?你也可以在一个循环中没有线程的情况下执行它。 – CodeCaster

+0

是的,你可以,但是你需要使用select。如果线程很少,这是解决问题的直观方法。 – Tudor

1
var ports = new List<int> { 1000, 1001, 1002 }; 

Parallel.ForEach(ports, p => 
{ 
    var data = GetDataForPort(p); 
    var path = string.Format(@"C:\{0}.txt", p); 

    using (var writer = new StreamWriter(path)) 
     writer.Write(data); 
});