Solved

Is .net Response.OutputStream.Write asynchronous?

Posted on 2009-04-08
2
1,425 Views
Last Modified: 2013-11-08
On Micorsofts website (http://support.microsoft.com/?kbid=812406) there's an article showing how to download very large files from a website.

Works great but...

In their sample code (see code section) they allocate a 10,000 byte buffer to chunk the byte file stream to the output stream. Fine. But in the loop they re-allocate a new 10,000 byte buffer for each chunk. Seems like a waste of memory.

I can only image that response.outputstream.write is running in a separate thread and may still be using the original buffer. I can't find any info on threading for this method.

Any thoughts on why/if the reallocation is necessary?
System.IO.Stream iStream = null;
 
// Buffer to read 10K bytes in chunk:
byte[] buffer = new Byte[10000];
 
// Length of the file:
int length;
 
// Total bytes to read:
long dataToRead;
 
// Identify the file to download including its path.
string filepath  = "DownloadFileName";
 
// Identify the file name.
string  filename  = System.IO.Path.GetFileName(filepath);
 
try
{
	// Open the file.
	iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open, 
					System.IO.FileAccess.Read,System.IO.FileShare.Read);
 
 
	// Total bytes to read:
	dataToRead = iStream.Length;
 
	Response.ContentType = "application/octet-stream";
	Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
 
	// Read the bytes.
	while (dataToRead > 0)
	{
		// Verify that the client is connected.
		if (Response.IsClientConnected) 
		{
			// Read the data in buffer.
			length = iStream.Read(buffer, 0, 10000);
 
			// Write the data to the current output stream.
			Response.OutputStream.Write(buffer, 0, length);
 
			// Flush the data to the HTML output.
			Response.Flush();
 
			buffer= new Byte[10000];
			dataToRead = dataToRead - length;
		}
		else
		{
			//prevent infinite loop if user disconnects
			dataToRead = -1;
		}
	}
}
catch (Exception ex) 
{
	// Trap the error, if any.
	Response.Write("Error : " + ex.Message);
}
finally
{
	if (iStream != null) 
	{
		//Close the file.
		iStream.Close();
	}
	Response.Close();
}

Open in new window

0
Comment
Question by:mduffin06
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
2 Comments
 
LVL 5

Accepted Solution

by:
burningmace earned 500 total points
ID: 24100186
It isn't necessary at all - the code would simply overwrite the old data with the new. You can comment line 46 out with no problems at all. I think the programmer did this just to make sure that the old data would not cause complications. However, it wouldn't be a waste of memory as the garbage collector would recognise that line 46 causes the old buffer asset to become orphaned and would unallocate it. I'm not sure how GC scheduling is handled in .NET, but the use of New may signal GC automatically to check if an old asset is being replaced. If not, then this method probably wastes around 500K of memory at peak before GC notices and clear it. Not really a huge issue with most systems having 1GB of memory or more these days. But yes, it is bad practice to do things like that.
0
 

Author Closing Comment

by:mduffin06
ID: 31568143
Per burningmace advice, removed new allocation. Seems to work fine. No problems to date.
0

Featured Post

Learn by Doing. Anytime. Anywhere.

Do you like to learn by doing?
Our labs and exercises give you the chance to do just that: Learn by performing actions on real environments.

Hands-on, scenario-based labs give you experience on real environments provided by us so you don't have to worry about breaking anything.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction This article shows how to use the open source plupload control to upload multiple images. The images are resized on the client side before uploading and the upload is done in chunks. Background I had to provide a way for user…
A long time ago (May 2011), I have written an article showing you how to create a DLL using Visual Studio 2005 to be hosted in SQL Server 2005. That was valid at that time and it is still valid if you are still using these versions. You can still re…
If you're a developer or IT admin, you’re probably tasked with managing multiple websites, servers, applications, and levels of security on a daily basis. While this can be extremely time consuming, it can also be frustrating when systems aren't wor…
In this video we outline the Physical Segments view of NetCrunch network monitor. By following this brief how-to video, you will be able to learn how NetCrunch visualizes your network, how granular is the information collected, as well as where to f…

729 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question