2013-08-14 4 views
2

Я хочу, чтобы убедиться, что задача продолжения не будет, если expection брошено в параллельном циклеСтоп Продолжение Задание на исключения выброшен из родительской задачи

var parent = tf.StartNew(() => 

    Parallel.ForEach(QuestionsLangConstants.questionLangs.Values, (i, state) => 
      { 
      try 
       { 
       qrepo.UploadQuestions(QWorkBook.Worksheets[i.QSheet], 
       QWorkBook.Worksheets[i.QTranslationSheet], i, prog); 
       } 
      catch (Exception ex) 
       { 

       context.Dispose(); 
       state.Break(); 
       //make sure the execution fails 
       } 
      })); 

var finalTast = parent.ContinueWith(i => 
      { 
       if (context != null) 
       { 
        DialogResult result = 
    MessageBox.Show("Do You Want to Commit the Questions?", "Save to DB", 
     MessageBoxButtons.OKCancel, MessageBoxIcon.Question); 

        if (result.Equals(DialogResult.OK)) 
        { 
         //Do Stuff here 
        } 
        else 
        { 
         return; 
        } 
       } 
      }); 
+0

Возможно, с 'if (! I.IsFaulted) ...', см. Http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.isfaulted.aspx –

ответ

2

Не проглотит исключение, и запустить только продолжить для не на неисправных

var parent = tf.StartNew(() => 

         Parallel.ForEach(QuestionsLangConstants.questionLangs.Values, (i, state) => 
         { 
          try 
          { 
           qrepo.UploadQuestions(QWorkBook.Worksheets[i.QSheet], QWorkBook.Worksheets[i.QTranslationSheet], i, prog); 

          } 
          catch (Exception ex) 
          { 

           context.Dispose(); 
           state.Break(); 
          //make sure the execution fails 
          throw; 
          } 
         })); 

var finalTast = parent.ContinueWith(i => 
      { 
       if (context != null) 
       { 
        DialogResult result = MessageBox.Show("Do You Want to Commit the Questions?", "Save to DB", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); 

        if (result.Equals(DialogResult.OK)) 
        { 
         //Do Stuff here 
        } 
        else 
        { 
         return; 
        } 
       } 
     }, TaskContinuationOptions.NotOnFaulted); 
2

Вы должны использовать ContinueWith overload, который принимает в TaskContinuationOptions и позволяют execption пузыриться

var parent = tf.StartNew(() => 

    Parallel.ForEach(QuestionsLangConstants.questionLangs.Values, (i, state) => 
      { 
      try 
       { 
       qrepo.UploadQuestions(QWorkBook.Worksheets[i.QSheet], 
       QWorkBook.Worksheets[i.QTranslationSheet], i, prog); 
       } 
      catch (Exception ex) 
       { 

       context.Dispose(); 
       state.Break(); 
       //make sure the execution fails 
       throw; //<-- This line was added to stop the continuation task. 
       } 
      })); 

var finalTast = parent.ContinueWith(i => 
      { 
       //... 
      }, TaskContinuationOptions.OnlyOnRanToCompletion); 
+0

Тогда мне нужно создать parent.continueWith это 'TaskContinuationOptions.OnFaulted', который будет генерировать сообщение об исключении? Тот, с которого начинается начальная cathc? – idipous

+0

просто бросает его в задачу продолжения, ничего не сделает для вас, однако вы можете поместить свой журнал внутри, или отобразить окно сообщения, показывающее, что произошла ошибка. –

+0

да, вот что я имел в виду. Благодарю. Я попробую и дам вам знать. – idipous