none
佇列,非同步傳輸 RRS feed

  • 問題

  • 1  public class MoveFile  
    2     {  
    3         int TotalSize;  //Total Size   
    4         int Position;   //Position   
    5         const int BUFFER_SIZE = 8192;  
    6         byte[] buffer;  
    7         FileStream FileWriteStream;  
    8         FileStream FileReadStream;  
    9  
    10         private string zSourcePath;  
    11         public string SourcePath  
    12         {  
    13             get { return (zSourcePath); }  
    14             set { zSourcePath = value; }  
    15         }  
    16         private string zTargetPath;  
    17         public string TatgetPath  
    18         {  
    19             get { return (zTargetPath); }  
    20             set { zTargetPath = value; }  
    21         }  
    22         private string zFileName;  
    23         public string FileName  
    24         {  
    25             get { return (zFileName); }  
    26             set { zFileName = value; }  
    27         }  
    28         public void CopyFile() { zCopyFile(); }  
    29         private void zEndReadCallBack(IAsyncResult ar)  
    30         {  
    31             int ReadedLength;  
    32             // Lock FileStream   
    33             lock (this.FileReadStream)  
    34             {  
    35                 ReadedLength = this.FileReadStream.EndRead(ar);   // When stream endread, get readed length   
    36  
    37             }  
    38             // Write to disk   
    39             if (this.FileWriteStream.CanWrite == true)  
    40             {  
    41                 this.FileWriteStream.Write(buffer, 0, buffer.Length);  
    42             }  
    43  
    44             Position += ReadedLength;  
    45             if (Position >= TotalSize) // Read over.   
    46             {  
    47                 FileReadStream.Close();  
    48                 FileWriteStream.Close();  
    49                 return;  
    50             }  
    51             else  
    52             {  
    53                 lock (this.FileReadStream)  
    54                 {  
    55                     int leftSize = TotalSize - Position;  
    56                     if (leftSize > BUFFER_SIZE)  
    57                     {  
    58                         buffer = new byte[BUFFER_SIZE];  
    59                         this.FileReadStream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(zEndReadCallBack), null);  
    60                     }  
    61                     else  
    62                     {  
    63                         buffer = new byte[leftSize];  
    64                         this.FileReadStream.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(zEndReadCallBack), null);  
    65                     }  
    66                 }  
    67             }  
    68         }  
    69         private void zCopyFile()  
    70         {  
    71             string strSource = zSourcePath;  
    72             string strTarget = zTargetPath;  
    73             string strFile = zFileName;  
    74             try  
    75             {  
    76                 //需檢查Target路徑是否存在  
    77  
    78                 FileReadStream = new FileStream(zSourcePath, FileMode.Open, FileAccess.Read, FileShare.Read);  
    79                 FileWriteStream = new FileStream(zTargetPath , FileMode.Create, FileAccess.Write, FileShare.Read);  
    80                 TotalSize = (int)FileReadStream.Length;  
    81                 if (TotalSize > BUFFER_SIZE)  
    82                 {  
    83                     buffer = new byte[BUFFER_SIZE];  
    84                     if (FileReadStream.CanRead == true)  
    85                     {  
    86                         FileReadStream.BeginRead(buffer, 0, BUFFER_SIZE, new AsyncCallback(zEndReadCallBack), null);  
    87                     }  
    88                     else  
    89                     {  
    90                     }  
    91                 }  
    92                 else  
    93                 {  
    94                     buffer = new byte[TotalSize];  
    95                     if (FileReadStream.CanRead == true)  
    96                     {  
    97                         FileReadStream.BeginRead(buffer, 0, TotalSize, new AsyncCallback(zEndReadCallBack), null);  
    98                     }  
    99                     else  
    100                     {  
    101                     }  
    102                 }  
    103             }  
    104             catch (IOException Err)  
    105             {  
    106                 return;  
    107             }  
    108         }  
    109     }  
    110  
    如上述,完成一個非同步的傳輸,
    未來這個類別我會應該自定義事件,當下載完成或錯誤會有事件發生,可以在form做處理 
    可是我想做到能夠佇列傳輸,當傳輸時最大筆數是5,其他都是佇列,小於5時再會繼續加入工作
    有點像flashget那種意思,目前想了很多方法 ,不過試驗都失敗
    2009年3月13日 上午 07:17

解答

  • 簡單一點的做法:

    先把檔案移動做成單緒的方式,測到沒問題。

    開一個 5 個元素的陣列放 Threading.Thread ,主執行緒定時輪詢 ThreadState 為 Stopped 時,把還沒跑到的清單列表檔案傳進去,啟動一個新工作即可。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    • 已標示為解答 ericstone 2009年3月19日 上午 08:34
    2009年3月13日 上午 08:01

所有回覆

  • 簡單一點的做法:

    先把檔案移動做成單緒的方式,測到沒問題。

    開一個 5 個元素的陣列放 Threading.Thread ,主執行緒定時輪詢 ThreadState 為 Stopped 時,把還沒跑到的清單列表檔案傳進去,啟動一個新工作即可。
    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    • 已標示為解答 ericstone 2009年3月19日 上午 08:34
    2009年3月13日 上午 08:01
  • 可是我想要這部份寫成一個class, 專門收要下載的檔案
    form方面使用這個class 大概只要以迴圈方式將檔案資訊 加進class,跟設定事件就行了
    class.complete+= new handle(complete);
    class.erroe+=new handle(error);
    class就會開始工作,當超過時就把把清單加入class裡的list
    全部寫在一個類別中可以達到嗎?

    2009年3月13日 上午 08:13
  • 那就讓一個執行緒做 Sleep 來控制這個迴圈即可。


    論壇是網友平等互助 保證解答請至 微軟技術支援服務
    2009年3月13日 上午 09:40
  • HI,

    除了自己寫程式控制以外, 也可以利用Microsoft Message Queue來做非同步訊息傳輸的佇列功能, 請參考:
    http://www.codeproject.com/KB/cs/mgpmyqueue.aspx
    2009年3月15日 上午 02:14