![]() |
[C#] Help with threads and file i/o
I hope I'll be able to delineate exactly what my problem is here. In short, I have 2 threads running side-by-side. Each thread has a file open that is being written to. The program is basically looping to try and find a prime factor (the RSA thing) and I write every nth prime to a file so as to have a backup in case of a crash or needing/wanting to shut down the program.
The problem is, the factors don't seem to write to the files unless it's closed properly (I don't understand this). So, I need to either find a way to close the file by pressing Ctrl+C or something, or I need to find a way to force the factors to be written. I doubt I've explained the problem properly, but feel free to ask questions about it. |
I think it may be that I/O is buffered so as to not drag down performance of the system if it had to keep writing often to the disk. First, how often are things written to the file. Second, there may be a way to force the write to occur...I think this may be your issue, and I think I've faced it before. I'll try to get back to you about it, or hopefully someone else has the answer already.
I guess in these coding cases, posting some source code is always useful if possible. |
The writes are happening roughly every 8 seconds and every 80 seconds (depending on which thread is writing).
|
How are you opening the file? And how do you know that both threads won't write to the same file simultaneously, thereby overwriting the other's work? This is a classical shared resource problem, and it's typically solved by busy waiting. Perform each calculation in the thread, but only allow a thread to open the file if it exists and is closed. If it's not closed, sleep until it opens. Once it's open, immediately write the data and close the file.
If you can somehow guarantee exclusive access or know that they won't be overwriting each other, make sure that you're setting the FileShare parameter when you open the file. i.e. new FileStream("Filename.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite) |
I have 2 separate files opened (csharplow.txt and csharphigh.txt). If I delete these two files before I run the program, they're created. I have also added a if(File.Exists()) for each one every time something is supposed to be written to either file, and the system recognizes that the file is there.
I'm using StreamWriter for each file (streamwriters are sw1 and sw2). |
Oh I think I see what you're saying now.. you want a way to terminate without loss of data?
PHP Code:
Do your calculations, start your threads, etc.. then PHP Code:
|
This is all in the main() function?
|
You have to flush the streamwriter. The OS determines when buffered writes actually make it to disk. When object is destroyed it forces a flush.
The stream writer has a function Flush() that will do it for you. It can be bad on performance but you can explicitly call Flush every time you write something. |
Daemon, that did the trick. And it doesn't really hurt the performance, at least not according to my stopwatch. Looks like this should do the trick. Thanks again.
|
I think from my experience the best way to deal with objects like this is to use the "using" operator when opening/closing he objects. By using "using", it automatically calls any dispose/flush/close functions that an object might have.
The syntax is like the following: using( StreamWriter strWriter = new StreamWriter ("txtFileName.txt") ) { // do whatever you want to do with it... // } When the "using" directive is out of scope/finished, it then automatically calls any cleanup functionality. I just find it is safer to use this way, and it might even be more efficient on the system (you'll have to look that up to verify). |
wombatman, glad to help. The performance issues with dynamically calling flush will not always be noticeable. If the OS is idle it will not have any impact but if its busy and you interupt it to force a flush it can be noticeable.
Nooze2k, that is the best way of handling the situation if you can limit the scope fo the streamwriter but it sounds like he wants to keep it open. Constantly opening and disposing the the streamwriter would be hell on performance. |
All times are GMT -8. The time now is 06:27 AM. |
Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2025, vBulletin Solutions, Inc.
Search Engine Optimization by vBSEO 3.6.0 PL2
© 2002-2012 Tilted Forum Project