2011-02-25 45 views
1

我有一个WCF服务,使客户端下载一些文件并发数据流。尽管每个客户端的请求都有一个新的服务实例,但如果两个客户端尝试同时下载同一个文件,则首先到达的请求会锁定该文件直到完成该文件。所以另一个客户端实际上是在等待第一个客户端完成,因为没有多个服务。必须有办法避免这种情况。我可以有一个物理文件

是否有任何人谁知道我怎样才能避免这种情况,而无需在服务器上的硬盘多份文件?还是我在做一些完全错误的事情?

这是服务器端代码:

`公共流DownloadFile(字符串路径) { System.IO.FileInfo的fileInfo =新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()); 
     } 
    } 
+1

你是如何读/文件发送到客户端?请显示一些代码。 – 2011-02-25 13:38:08

+0

Sory,这里是服务器端功能和客户端功能。 – 2011-02-25 14:10:21

回答

0

我Kjörling先生的意见,这是很难帮助没有看到你在做什么。既然你只是从你的服务器下载文件,为什么你打开它作为R/W(导致锁)。如果以只读方式打开它,则不会锁定。如果我的建议缺乏,请不要模糊,因为这只是我对问题的解释而没有大量的信息。

+0

我添加了代码。我不明白,我是如何将其打开为只读的?我已经将FileAccess设置为Read,是不是你在说什么?或者还有什么我必须做的? – 2011-02-25 14:09:03

+1

这不一定是导致锁定的'FileAccess',请检查'FileShare',FileStream可用的第三个参数。 – 2011-02-25 14:22:20

0

试试这个,它应该使两个线程同时并且独立的读取文件:

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

好吧,我会尝试使用FileShare,只是我现在无法尝试。这将不得不等到我明天去我的办公室......我会检查答案,如果它的工作。 – 2011-02-25 14:51:41

相关问题