Results 1 to 2 of 2

Thread: The stream does not support concurrent IO read or write operations.

  1. #1
    Lively Member
    Join Date
    Mar 12
    Posts
    66

    The stream does not support concurrent IO read or write operations.

    Here is the function it happens in:

    Code:
    public static string UploadFile(string uploadfile, string url, int speedLimit, string fileFormName, string contenttype, NameValueCollection querystring, CookieContainer cookies)
            {
                if (String.IsNullOrEmpty(fileFormName))
                {
                    fileFormName = "file";
                }
    
                if (String.IsNullOrEmpty(contenttype))
                {
                    contenttype = "application/octet-stream";
                }
    
                string postdata = string.Empty;
                if (querystring != null)
                {
                    postdata += "?";
                    foreach (string key in querystring.Keys)
                    {
                        postdata += key + "=" + querystring.Get(key) + "&";
                    }
                }
                Uri uri = new Uri(url + postdata);
    
    
                string boundary = "----------" + DateTime.Now.Ticks.ToString("x");
                HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(uri);
                webrequest.CookieContainer = cookies;
                webrequest.ContentType = "multipart/form-data; boundary=" + boundary;
                webrequest.Method = "POST";
                webrequest.Timeout = 3600 * 1000;
                webrequest.ReadWriteTimeout = 3600 * 1000;
    
                // Build up the post message header
                StringBuilder sb = new StringBuilder();
                sb.Append("--");
                sb.Append(boundary);
                sb.Append("\r\n");
                sb.Append("Content-Disposition: form-data; name=\"");
                sb.Append(fileFormName);
                sb.Append("\"; filename=\"");
                sb.Append(Path.GetFileName(uploadfile));
                sb.Append("\"");
                sb.Append("\r\n");
                sb.Append("Content-Type: ");
                sb.Append(contenttype);
                sb.Append("\r\n");
                sb.Append("\r\n");
    
                string postHeader = sb.ToString();
                byte[] postHeaderBytes = Encoding.UTF8.GetBytes(postHeader);
    
                // Build the trailing boundary string as a byte array
                // ensuring the boundary appears on a line by itself
                byte[] boundaryBytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
    
                FileStream fileStream = new FileStream(uploadfile, FileMode.Open, FileAccess.Read);
                long length = postHeaderBytes.Length + fileStream.Length + boundaryBytes.Length;
                webrequest.ContentLength = length;
    
                Stream requestStream = webrequest.GetRequestStream();
                requestStream.WriteTimeout = 5 * 3600 * 1000;
                requestStream.ReadTimeout = 5 * 3600 * 1000;
    
                // Write out our post header
                requestStream.Write(postHeaderBytes, 0, postHeaderBytes.Length);
    
                // Write out the file contents
                byte[] buffer = new Byte[checked((uint)Math.Min(4096, (int)fileStream.Length))];
                int bytesRead;
    
                while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                {
                    requestStream.Write(buffer, 0, bytesRead); //On this row
    
                    decimal speedDelay = 1000 / (speedLimit / (buffer.Length / (decimal)1000));
                    Thread.Sleep((int)Math.Round(speedDelay, MidpointRounding.ToEven));
                }
    
                // Write out the trailing boundary
                requestStream.Write(boundaryBytes, 0, boundaryBytes.Length);
                WebResponse responce = webrequest.GetResponse();
                Stream s = responce.GetResponseStream();
                StreamReader sr = new StreamReader(s);
    
                return sr.ReadToEnd();
            }
    I get the exception on the marked row, when I am writing to the stream. I am not sure why I get it but it only happens when I use the function to upload a file to a local server, meaning that it goes at 1 megabyte/s instead of ~100 kB/s.

    The weird thing is that it always happens after a certain amount of time. It uploads for like 2 minutes, then I get the error.

    Any clue to why this happens?

  2. #2
    Fanatic Member
    Join Date
    Feb 00
    Location
    Dunmow,Essex,England
    Posts
    892

    Re: The stream does not support concurrent IO read or write operations.

    This error is as it states. There is more than one process trying to access the stream at one time. I can see this might happen if you have more than one user since you have declared the class as static. You need to create a new instance of the class each time or test to ensure the stream isn't currently in use before attempting to use it and handle accordingly.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •