2014-10-31 40 views
-1

下面的代码用于将数据从本地系统移动到外部硬盘驱动器。客户的要求是使用线程来加速页面/分钟的复制。如何处理线程中的继续声明

我正面临一个问题。我在while循环中使用了continue语句,这在线程中是不可接受的。有人可以请建议替代相同的。

谢谢。

private void PromoteMain(TextWriter streamWriter) 
    { 
     string driveLetterString; 
     driveLetterString = GetExternalDrive(); 
     if (!string.IsNullOrEmpty(driveLetterString)) 
     { 

      DataSet dataSet; 
      DateTime startSnooze; 
      DataRow row; 
      string imageIdString; 
      string reelIdString; 
      string destImagePathString; 
      string[] strArrays; 
      int i; 
      string fileName; 
      string[] strArrays3; 
      string[] strArrays4; 
      bool flag; 
      string[] strArrays5; 
      bool flag1; 
      string[] strArrays6; 
      bool flag2; 
      string[] files; 
      TimeSpan timeSpan1; 
      IEnumerator iEnumerator1; 
      string[] stringArray1; 
      IDisposable iDisposable1; 
      dataSet = this.GetImagesFromDatabase(); 
      if (((dataSet != null) && (dataSet.Tables.Count != 0)) && (dataSet.Tables[0].Rows.Count != 0)) 
      { 
       iEnumerator1 = dataSet.Tables[0].Rows.GetEnumerator(); 
       try 
       { 
        #region goto L_05A9 
        //goto L_05A9; 
        while (iEnumerator1.MoveNext()) 
        { 
         driveLetterString = GetExternalDrive(); 
         new Thread(() => 
         { 
          if (!string.IsNullOrEmpty(driveLetterString)) 
          { 
           row = ((DataRow)iEnumerator1.Current); 
           imageIdString = row["imageid"].ToString(); 
           reelIdString = row["reelid"].ToString(); 
           destImagePathString = row["destimagepath"].ToString(); 
           if (!Directory.Exists(destImagePathString)) 
           { 
            if (this.stringBuilderFail.Length > 0) 
            { 
             StringBuilder stringBuilder7 = this.stringBuilderFail.Append(","); 
            } 
            StringBuilder stringBuilder8 = this.stringBuilderFail.Append(imageIdString); 
            this._lblFailed.Text = Convert.ToString(((int)(Convert.ToInt32(this._lblFailed.Text) + 1))); 
            if (this.stringBuilderFail.Length > 7000) 
            { 
             this.UpdateImagesInDatabase(this.stringBuilderFail.ToString(), "5"); 
             StringBuilder stringBuilder9 = this.stringBuilderFail.Remove(0, this.stringBuilderFail.Length); 
            } 
            this.RefreshFormView(); 
            continue; 
           } 
           if (!Directory.Exists((driveLetterString + "newspaper\\" + reelIdString + "\\"))) 
           { 
            DirectoryInfo directoryInfo1 = Directory.CreateDirectory((driveLetterString + "newspaper\\" + reelIdString + "\\")); 
           } 
           strArrays = new string[] { ".pdf", ".html", "_clean.html", "_lx.jpg" }; 
           for (i = 0; (i < strArrays.Length); i++) 
           { 
            fileName = strArrays[i]; 
            try 
            { 
             if (i != 2) 
             { 
              strArrays3 = new string[] { driveLetterString, "newspaper\\", reelIdString, "\\", imageIdString, fileName }; 
              File.Copy((destImagePathString + imageIdString + fileName), string.Concat(strArrays3)); 
             } 
            } 
            catch 
            { 
            } 
           } 
           strArrays4 = new string[] { driveLetterString, "newspaper\\", reelIdString, "\\", imageIdString, ".pdf" }; 
           flag = File.Exists(string.Concat(strArrays4)); 
           strArrays5 = new string[] { driveLetterString, "newspaper\\", reelIdString, "\\", imageIdString, "_lx.jpg" }; 
           flag1 = File.Exists(string.Concat(strArrays5)); 
           strArrays6 = new string[] { driveLetterString, "newspaper\\", reelIdString, "\\", imageIdString, ".html" }; 
           flag2 = File.Exists(string.Concat(strArrays6)); 
           if ((flag && flag1) && flag2) 
           { 
            streamWriter.WriteLine(imageIdString); 
            if (this.stringBuilderSuccess.Length > 0) 
            { 
             StringBuilder stringBuilder3 = this.stringBuilderSuccess.Append(","); 
            } 
            StringBuilder stringBuilder4 = this.stringBuilderSuccess.Append(imageIdString); 
            this._lblPromoted.Text = Convert.ToString(((int)(Convert.ToInt32(this._lblPromoted.Text) + 1))); 
            #region goto L_0453 
            L_0453(); 
            continue; 
            #endregion 
           } 
           files = Directory.GetFiles((driveLetterString + "newspaper\\" + reelIdString + "\\"), (imageIdString + "*.*")); 
           stringArray1 = files; 
           foreach (string str6 in stringArray1) 
           { 
            try 
            { 
             File.Delete(str6); 
            } 
            catch 
            { 
            } 
           } 
           if (this.stringBuilderFail.Length > 0) 
           { 
            StringBuilder stringBuilder1 = this.stringBuilderFail.Append(","); 
           } 
           StringBuilder stringBuilder2 = this.stringBuilderFail.Append(imageIdString); 
           this._lblFailed.Text = Convert.ToString(((int)(Convert.ToInt32(this._lblFailed.Text) + 1))); 
           #region goto L_0453 
           L_0453(); 
           continue; 
           #endregion 
          } 
          else 
          { 
           break; 
          }; 
         }).Start(); 
        } 
        #endregion 
       } 
       finally 
       { 
        iDisposable1 = (iEnumerator1 as IDisposable); 
        if (iDisposable1 != null) 
        { 
         iDisposable1.Dispose(); 
        } 
       } 
       if (this.stringBuilderSuccess.Length > 0) 
       { 
        this.UpdateImagesInDatabase(this.stringBuilderSuccess.ToString(), "3"); 
        StringBuilder stringBuilder10 = this.stringBuilderSuccess.Remove(0, this.stringBuilderSuccess.Length); 
       } 
       if (this.stringBuilderFail.Length > 0) 
       { 
        this.UpdateImagesInDatabase(this.stringBuilderFail.ToString(), "5"); 
        StringBuilder stringBuilder11 = this.stringBuilderFail.Remove(0, this.stringBuilderFail.Length); 
       } 
       this.RefreshFormView(); 
       #region goto L_0671 
       PromoteMain(streamWriter); 
       #endregion 
      } 
      else 
      { 
       startSnooze = DateTime.Now; 
       timeSpan1 = DateTime.Now.Subtract(startSnooze); 
       while (timeSpan1.TotalSeconds < 300D) 
       { 
        timeSpan1 = DateTime.Now.Subtract(startSnooze); 
        Thread.Sleep(125); 
        Application.DoEvents(); 

       } 
       PromoteMain(streamWriter); 
      } 
     } 
     //else 
     //{ 
     // MessageBox.Show("There is no space in selected drives"); 
     // //there is no space in any external drive 
     //} 
    } 

    private void L_0453() 
    { 
     if (this.stringBuilderSuccess.Length > 7000) 
     { 
      this.UpdateImagesInDatabase(this.stringBuilderSuccess.ToString(), "3"); 
      StringBuilder stringBuilder5 = this.stringBuilderSuccess.Remove(0, this.stringBuilderSuccess.Length); 
     } 
     if (this.stringBuilderFail.Length > 7000) 
     { 
      this.UpdateImagesInDatabase(this.stringBuilderFail.ToString(), "5"); 
      StringBuilder stringBuilder6 = this.stringBuilderFail.Remove(0, this.stringBuilderFail.Length); 
     } 
     this.RefreshFormView(); 
    } 
+1

你能否详细说明“不可接受”? – 2014-10-31 12:07:15

+1

这个问题基本上要求我们修复你的反编译代码。告诉你明白你在做什么,并提出一个具体的问题,或者回到绘图板并从头开始重写这个功能。你没有从中学到任何东西,对任何人都没有帮助。 – CodeCaster 2014-10-31 12:39:35

回答

0

将continue语句替换为return。这将完成线程的执行。现在我不知道这个继续声明是如何在那里结束的,但是由于这些操作是并行运行的,所以你不能实际继续。你也应该提取该行

row = ((DataRow)iEnumerator1.Current); 

或你的风险普查员在执行之前,从另一个线程改变。您也可以尝试使用Parallel.Foreach来减少可能的错误并获得更有效的执行。更好的办法是使用async IO的异步方法(与使用线程的方法相反)并使用Task.WaitAll等待它们完成。