Могу ли я иметь одновременные потоки на одном физическом файле - PullRequest
1 голос
/ 25 февраля 2011

У меня есть служба wcf, которая позволяет клиентам загружать некоторые файлы. Хотя для каждого запроса клиента существует новый экземпляр службы, если два клиента пытаются загрузить один и тот же файл одновременно, первый поступающий запрос блокирует файл до тех пор, пока он не будет завершен. Таким образом, другой клиент фактически ожидает завершения работы первого клиента, так как нет нескольких служб. Должен быть способ избежать этого.

Есть ли кто-нибудь, кто знает, как я могу избежать этого, не имея нескольких файлов на жестком диске сервера? Или я что-то не так делаю?

это код на стороне сервера:

`public Stream DownloadFile (путь строки) { System.IO.FileInfo fileInfo = new System.IO.FileInfo (путь);

        // 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;
    }`

это код на стороне клиента:

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 TransferStartArgs());
                    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());
        }
    }

Ответы [ 2 ]

0 голосов
/ 25 февраля 2011

Попробуйте, это должно позволить двум потокам читать файл одновременно и независимо:

System.IO.FileStream stream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
0 голосов
/ 25 февраля 2011

Я согласен с мистером Кьёрлингом, трудно помочь, не видя, что вы делаете. Поскольку вы просто скачиваете файлы с вашего сервера, почему вы открываете его как R / W (вызывая блокировку). Если вы откроете его только для чтения, он не будет заблокирован. Пожалуйста, не изменяйте мод, если мое предложение отсутствует, поскольку это только моя интерпретация проблемы без большой информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...