开发者

Can I have simultaneous streams on one physical file

I have a wcf service that allow clients to download some files. Although there is a new instance of service for every client's request, if two clients try to download same file at the same time, first request to arrive locks the file until it is finished with it. So the other client is actually waiting for first client to finish as there is no multiple services. There must be a way to avoid this.

Is there anyone who knows how I can avoid this without having multiple files on servers hard disk? Or am I doing something totally wrong?

this is server side code:

`public Stream DownloadFile(string path) { System.IO.FileInfo fileInfo = new System.IO.FileInfo(path);

        // check if exists
        if (!fileInfo.Exists) throw new FileNotFoundException();

        // open stream
        System.IO.FileStream stream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read);

        // return result
        return stream;
    }`

this is client side code:

public void Download(string serverPath, string path)
    {
        Stream stream;
        try
        {
            if (System.IO.File.Exists(path)) System.IO.File.Delete(path);
            serviceStreamed = new ServiceStreamedClient("NetTcpBinding_IServiceStreamed");
            SimpleResult<long> res = serviceStreamed.ReturnFileSize(serverPath);
            if (!res.Success)
            {
                throw new Exception("File not found: \n" + serverPath);
            }
            // get stream from server
            stream = serviceStreamed.DownloadFile(serverPath);

                // write server stream to disk
                using (System.IO.FileStream writeStream = new System.IO.FileStream(path, System.IO.FileMode.CreateNew, System.IO.FileAccess.Write))
                {
                    int chunkSize = 1 * 48 * 1024;
                    byte[] buffer = new byte[chunkSize];
                    OnTransferStart(new TransferSta开发者_JS百科rtArgs());
                    do
                    {
                        // read bytes from input stream
                        int bytesRead = stream.Read(buffer, 0, chunkSize);
                        if (bytesRead == 0) break;


                        // write bytes to output stream
                        writeStream.Write(buffer, 0, bytesRead);


                        // report progress from time to time
                        OnProgressChanged(new ProgressChangedArgs(writeStream.Position));
                    } while (true);

                    writeStream.Close();
                    stream.Dispose();



                }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            if (serviceStreamed.State == System.ServiceModel.CommunicationState.Opened)
            {
                serviceStreamed.Close();
            }
            OnTransferFinished(new TransferFinishedArgs());
        }
    }


I agree with Mr. Kjörling, it's hard to help without seeing what you're doing. Since you're just downloading files from your server, why are you opening it as R/W (causing the lock). If you open it as read only, then it won't lock. Please don't mod down if my suggestion is lacking as it is only my interpretation of the problem w/o a lot of information.


Try this, it should enable two threads to read the file concurrently and independently:

System.IO.FileStream stream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜