2011-09-03 94 views
1

我正在写一个Outlook插件,用于将大文件传输到要复制的Web服务,但是当我有多个附件时,循环仅将其中一个附件发送到Web服务。我似乎无法弄清楚我需要做什么才能将代码传递给多个背景工作者而没有附件的硬限制。有任何想法吗?多次调用后台工作线程?

private BackgroundWorker bw = new BackgroundWorker(); 

    public string pubAttFullPath = null; 
    public string pubAttFileName = null; 
    public void SM_ItemSend(Object Item, ref bool Cancel) 
    { 
     Outlook.MailItem mailItem = Item as Outlook.MailItem; 
     if (mailItem != null) 
     { 
      int minAttachSize = 40960000; //SM_GetMinSize(); 
      for (int i = 1; i<=mailItem.Attachments.Count; i++) 
      { 
       if (mailItem.Attachments[i].Size < minAttachSize) 
       { 
        System.Windows.Forms.MessageBox.Show("This does NOT meet the minimum attachment size of " + minAttachSize); 
       } 
       else 
       { 
        string attFullFilePath = System.IO.Path.GetFullPath(mailItem.Attachments[i].FileName); 
        pubAttFullPath = attFullFilePath; 
        pubAttFileName = mailItem.Attachments[i].FileName; 

        Guid smGuid; 
        smGuid = Guid.NewGuid(); 

        bw.WorkerReportsProgress = true; 
        bw.WorkerSupportsCancellation = true; 
        bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
        bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 
        bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 


        if (bw.IsBusy != true) 
        { 
         bw.RunWorkerAsync(); 
        } 

        mailItem.Attachments[i].Delete();  

       } 
      }     
     } 
    } 

private void bw_DoWork(object sender, DoWorkEventArgs e) 
    { 
     System.Windows.Forms.Application.DoEvents(); 
     BackgroundWorker worker = sender as BackgroundWorker; 
     if ((!worker.CancellationPending == true)) 
     { 

     TransferFile.TransferFileSoapClient ws_TransferFile = new TransferFile.TransferFileSoapClient(); 

      bool transfercompleted = false; 
      using (FileStream fs = new FileStream(
       pubAttFullPath, 
       FileMode.Open, 
       FileAccess.Read, 
       FileShare.Read)) 
      { 
       //Declare Buffers and Counts 
       byte[] buffer = new byte[49152]; 
       long fileSize = fs.Length; 
       long totalReadCount = 0; 
       int readCount; 
       //Loop and copy file until it changes to not exactly the same byte count as the buffer 
       //which means the file is about to complete. 
      while ((readCount = 
        fs.Read(buffer, 0, buffer.Length)) > 0) 
       {    
        if (!transfercompleted) 
        { 
         totalReadCount += readCount; 
         byte[] bytesToTransfer; 

         if (readCount == buffer.Length) 
         { 
          // Shortcut to not need to copy more bytes. 
          bytesToTransfer = buffer; 
          ws_TransferFile.WriteBinaryFile(bytesToTransfer, pubAttFileName); 
         } 
         else 
         { 
          // Only a part is requred to upload, 
          // copy that part. 
          List<byte> b = new List<byte>(buffer); 

          bytesToTransfer = 
           b.GetRange(0, readCount).ToArray(); 
          ws_TransferFile.WriteBinaryFile(bytesToTransfer, pubAttFileName); 

          transfercompleted = true; 
          break; 
         }       
        } 
       } 
      } 
     } 
     //Cancel the job, cause for some reason it likes to loop twice and ruin your transfer 
     e.Cancel = true; 
     worker.CancelAsync(); 
    } 

回答

0

看看Task class,你可以用它来代替后台工作者。您可以将一个附件的复制操作定义为一项任务,并根据附件数量同时产生多个任务。

+0

所以,我现在试着使用它,并且确实对多个附件有效,但是我原来的问题,以及为什么我最初去了BackgroundWorker,当它做这个工作时,它冻结了等待任务完成的outlook。 。有什么办法解决这个问题 –

+0

没关系,我像一个愚蠢的人打电话给Wait()。谢谢你,那就是诀窍! –

+0

尽管与BackgroundWorker进程相比,我在传输文件时收到了37亿个页面错误,并且速度超过了100倍... –