Task Execution with Cancel Logic











up vote
1
down vote

favorite
1












In my assignment I am executing a long running NodeJs script from C# using EdgeJs. Since the script may take a long time to execute, I also want to provide user an option to Cancel the script execution in the middle. The cancellation status is maintained in the database and function IsScripteExecutionCancelled returns true if the user decides to cancel the execution.



To achieve this I am executing script in a background thread using Task.Run(). The main thread contains a while loop that runs until the ScriptExecution is over or is cancelled. I can solve this problem using native System.Threading.Thread, but here I am trying to do it using TPL. Here is the code I have put in place:



bool executionStarted = false;
bool taskCompleted = false;
Result returnValue;

CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;

Task executionTask;
while (!(taskCompleted || token.IsCancellationRequested))
{
if (!executionStarted)
{
executionStarted = true;
executionTask = Task.Run(() =>
{
returnValue = ExecuteScript();
taskCompleted = true;
}, token);
}
bool taskExecutionCancelled = IsScripteExecutionCancelled();
if (taskExecutionCancelled)
{
tokenSource.Cancel();
}
}

if(token.IsCancellationRequested)
returnValue= GetDefaultValueForCancellation();

return returnValue;


So, if IsScripteExecutionCancelled returns true the program will come out of the loop and will check if the script was cancelled, in which case I will return a default response. If the ExecuteScript completes my program will return the value returned by function ExecuteScript. I am able to get the desired results using this implementation however I would like to get it validated.



Question: Is it the right way to address this problem?










share|improve this question
















bumped to the homepage by Community 10 mins ago


This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.











  • 1




    You are going to have to provide more context. It is unclear what this code is suppose to be doing.
    – Nkosi
    Mar 13 at 11:33










  • This question is incomplete. To help reviewers give you better answers, please add sufficient context to your question. The more you tell us about what your code does and what the purpose of doing that is, the easier it will be for reviewers to help you. Questions should include a description of what the code does
    – Dannnno
    Mar 13 at 13:57















up vote
1
down vote

favorite
1












In my assignment I am executing a long running NodeJs script from C# using EdgeJs. Since the script may take a long time to execute, I also want to provide user an option to Cancel the script execution in the middle. The cancellation status is maintained in the database and function IsScripteExecutionCancelled returns true if the user decides to cancel the execution.



To achieve this I am executing script in a background thread using Task.Run(). The main thread contains a while loop that runs until the ScriptExecution is over or is cancelled. I can solve this problem using native System.Threading.Thread, but here I am trying to do it using TPL. Here is the code I have put in place:



bool executionStarted = false;
bool taskCompleted = false;
Result returnValue;

CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;

Task executionTask;
while (!(taskCompleted || token.IsCancellationRequested))
{
if (!executionStarted)
{
executionStarted = true;
executionTask = Task.Run(() =>
{
returnValue = ExecuteScript();
taskCompleted = true;
}, token);
}
bool taskExecutionCancelled = IsScripteExecutionCancelled();
if (taskExecutionCancelled)
{
tokenSource.Cancel();
}
}

if(token.IsCancellationRequested)
returnValue= GetDefaultValueForCancellation();

return returnValue;


So, if IsScripteExecutionCancelled returns true the program will come out of the loop and will check if the script was cancelled, in which case I will return a default response. If the ExecuteScript completes my program will return the value returned by function ExecuteScript. I am able to get the desired results using this implementation however I would like to get it validated.



Question: Is it the right way to address this problem?










share|improve this question
















bumped to the homepage by Community 10 mins ago


This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.











  • 1




    You are going to have to provide more context. It is unclear what this code is suppose to be doing.
    – Nkosi
    Mar 13 at 11:33










  • This question is incomplete. To help reviewers give you better answers, please add sufficient context to your question. The more you tell us about what your code does and what the purpose of doing that is, the easier it will be for reviewers to help you. Questions should include a description of what the code does
    – Dannnno
    Mar 13 at 13:57













up vote
1
down vote

favorite
1









up vote
1
down vote

favorite
1






1





In my assignment I am executing a long running NodeJs script from C# using EdgeJs. Since the script may take a long time to execute, I also want to provide user an option to Cancel the script execution in the middle. The cancellation status is maintained in the database and function IsScripteExecutionCancelled returns true if the user decides to cancel the execution.



To achieve this I am executing script in a background thread using Task.Run(). The main thread contains a while loop that runs until the ScriptExecution is over or is cancelled. I can solve this problem using native System.Threading.Thread, but here I am trying to do it using TPL. Here is the code I have put in place:



bool executionStarted = false;
bool taskCompleted = false;
Result returnValue;

CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;

Task executionTask;
while (!(taskCompleted || token.IsCancellationRequested))
{
if (!executionStarted)
{
executionStarted = true;
executionTask = Task.Run(() =>
{
returnValue = ExecuteScript();
taskCompleted = true;
}, token);
}
bool taskExecutionCancelled = IsScripteExecutionCancelled();
if (taskExecutionCancelled)
{
tokenSource.Cancel();
}
}

if(token.IsCancellationRequested)
returnValue= GetDefaultValueForCancellation();

return returnValue;


So, if IsScripteExecutionCancelled returns true the program will come out of the loop and will check if the script was cancelled, in which case I will return a default response. If the ExecuteScript completes my program will return the value returned by function ExecuteScript. I am able to get the desired results using this implementation however I would like to get it validated.



Question: Is it the right way to address this problem?










share|improve this question















In my assignment I am executing a long running NodeJs script from C# using EdgeJs. Since the script may take a long time to execute, I also want to provide user an option to Cancel the script execution in the middle. The cancellation status is maintained in the database and function IsScripteExecutionCancelled returns true if the user decides to cancel the execution.



To achieve this I am executing script in a background thread using Task.Run(). The main thread contains a while loop that runs until the ScriptExecution is over or is cancelled. I can solve this problem using native System.Threading.Thread, but here I am trying to do it using TPL. Here is the code I have put in place:



bool executionStarted = false;
bool taskCompleted = false;
Result returnValue;

CancellationTokenSource tokenSource = new CancellationTokenSource();
CancellationToken token = tokenSource.Token;

Task executionTask;
while (!(taskCompleted || token.IsCancellationRequested))
{
if (!executionStarted)
{
executionStarted = true;
executionTask = Task.Run(() =>
{
returnValue = ExecuteScript();
taskCompleted = true;
}, token);
}
bool taskExecutionCancelled = IsScripteExecutionCancelled();
if (taskExecutionCancelled)
{
tokenSource.Cancel();
}
}

if(token.IsCancellationRequested)
returnValue= GetDefaultValueForCancellation();

return returnValue;


So, if IsScripteExecutionCancelled returns true the program will come out of the loop and will check if the script was cancelled, in which case I will return a default response. If the ExecuteScript completes my program will return the value returned by function ExecuteScript. I am able to get the desired results using this implementation however I would like to get it validated.



Question: Is it the right way to address this problem?







c# task-parallel-library






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Mar 14 at 16:48









Sᴀᴍ Onᴇᴌᴀ

8,07461751




8,07461751










asked Mar 13 at 10:33









Aashish

1394




1394





bumped to the homepage by Community 10 mins ago


This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.







bumped to the homepage by Community 10 mins ago


This question has answers that may be good or bad; the system has marked it active so that they can be reviewed.










  • 1




    You are going to have to provide more context. It is unclear what this code is suppose to be doing.
    – Nkosi
    Mar 13 at 11:33










  • This question is incomplete. To help reviewers give you better answers, please add sufficient context to your question. The more you tell us about what your code does and what the purpose of doing that is, the easier it will be for reviewers to help you. Questions should include a description of what the code does
    – Dannnno
    Mar 13 at 13:57














  • 1




    You are going to have to provide more context. It is unclear what this code is suppose to be doing.
    – Nkosi
    Mar 13 at 11:33










  • This question is incomplete. To help reviewers give you better answers, please add sufficient context to your question. The more you tell us about what your code does and what the purpose of doing that is, the easier it will be for reviewers to help you. Questions should include a description of what the code does
    – Dannnno
    Mar 13 at 13:57








1




1




You are going to have to provide more context. It is unclear what this code is suppose to be doing.
– Nkosi
Mar 13 at 11:33




You are going to have to provide more context. It is unclear what this code is suppose to be doing.
– Nkosi
Mar 13 at 11:33












This question is incomplete. To help reviewers give you better answers, please add sufficient context to your question. The more you tell us about what your code does and what the purpose of doing that is, the easier it will be for reviewers to help you. Questions should include a description of what the code does
– Dannnno
Mar 13 at 13:57




This question is incomplete. To help reviewers give you better answers, please add sufficient context to your question. The more you tell us about what your code does and what the purpose of doing that is, the easier it will be for reviewers to help you. Questions should include a description of what the code does
– Dannnno
Mar 13 at 13:57










2 Answers
2






active

oldest

votes

















up vote
0
down vote














Is there a better way of doing Task cancellation than the one I implemented




There's no task cancellation implemented here. By passing a token to Task.Run you just make the returned task IsCanceled equal to true in case it cancels itself (without, it gets IsFaulted by the OperationCanceledException). But you need (at least) to pass the token to DoSomeWork, because that has to check the token and cancel itself.



Task cancellation works through cooperation of the to-be-canceled task and has nothing to do with Thread.Abort.






share|improve this answer




























    up vote
    0
    down vote













    you create a variable here and use it only once




    bool taskExecutionCancelled = IsScripteExecutionCancelled();
    if (taskExecutionCancelled)
    {
    tokenSource.Cancel();
    }



    I would just use the method in the if statement, like



    if (IsScripteExecutionCancelled())
    {
    tokenSource.Cancel();
    }


    if you were going to use this value somewhere else and didn't want it evaluated again, then you could assign it to a variable, but then you need to keep in mind that calling the variable will not run the method.






    share|improve this answer























      Your Answer





      StackExchange.ifUsing("editor", function () {
      return StackExchange.using("mathjaxEditing", function () {
      StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
      StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
      });
      });
      }, "mathjax-editing");

      StackExchange.ifUsing("editor", function () {
      StackExchange.using("externalEditor", function () {
      StackExchange.using("snippets", function () {
      StackExchange.snippets.init();
      });
      });
      }, "code-snippets");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "196"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      convertImagesToLinks: false,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: null,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f189478%2ftask-execution-with-cancel-logic%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      2 Answers
      2






      active

      oldest

      votes








      2 Answers
      2






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes








      up vote
      0
      down vote














      Is there a better way of doing Task cancellation than the one I implemented




      There's no task cancellation implemented here. By passing a token to Task.Run you just make the returned task IsCanceled equal to true in case it cancels itself (without, it gets IsFaulted by the OperationCanceledException). But you need (at least) to pass the token to DoSomeWork, because that has to check the token and cancel itself.



      Task cancellation works through cooperation of the to-be-canceled task and has nothing to do with Thread.Abort.






      share|improve this answer

























        up vote
        0
        down vote














        Is there a better way of doing Task cancellation than the one I implemented




        There's no task cancellation implemented here. By passing a token to Task.Run you just make the returned task IsCanceled equal to true in case it cancels itself (without, it gets IsFaulted by the OperationCanceledException). But you need (at least) to pass the token to DoSomeWork, because that has to check the token and cancel itself.



        Task cancellation works through cooperation of the to-be-canceled task and has nothing to do with Thread.Abort.






        share|improve this answer























          up vote
          0
          down vote










          up vote
          0
          down vote










          Is there a better way of doing Task cancellation than the one I implemented




          There's no task cancellation implemented here. By passing a token to Task.Run you just make the returned task IsCanceled equal to true in case it cancels itself (without, it gets IsFaulted by the OperationCanceledException). But you need (at least) to pass the token to DoSomeWork, because that has to check the token and cancel itself.



          Task cancellation works through cooperation of the to-be-canceled task and has nothing to do with Thread.Abort.






          share|improve this answer













          Is there a better way of doing Task cancellation than the one I implemented




          There's no task cancellation implemented here. By passing a token to Task.Run you just make the returned task IsCanceled equal to true in case it cancels itself (without, it gets IsFaulted by the OperationCanceledException). But you need (at least) to pass the token to DoSomeWork, because that has to check the token and cancel itself.



          Task cancellation works through cooperation of the to-be-canceled task and has nothing to do with Thread.Abort.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered Mar 13 at 15:36









          Haukinger

          1214




          1214
























              up vote
              0
              down vote













              you create a variable here and use it only once




              bool taskExecutionCancelled = IsScripteExecutionCancelled();
              if (taskExecutionCancelled)
              {
              tokenSource.Cancel();
              }



              I would just use the method in the if statement, like



              if (IsScripteExecutionCancelled())
              {
              tokenSource.Cancel();
              }


              if you were going to use this value somewhere else and didn't want it evaluated again, then you could assign it to a variable, but then you need to keep in mind that calling the variable will not run the method.






              share|improve this answer



























                up vote
                0
                down vote













                you create a variable here and use it only once




                bool taskExecutionCancelled = IsScripteExecutionCancelled();
                if (taskExecutionCancelled)
                {
                tokenSource.Cancel();
                }



                I would just use the method in the if statement, like



                if (IsScripteExecutionCancelled())
                {
                tokenSource.Cancel();
                }


                if you were going to use this value somewhere else and didn't want it evaluated again, then you could assign it to a variable, but then you need to keep in mind that calling the variable will not run the method.






                share|improve this answer

























                  up vote
                  0
                  down vote










                  up vote
                  0
                  down vote









                  you create a variable here and use it only once




                  bool taskExecutionCancelled = IsScripteExecutionCancelled();
                  if (taskExecutionCancelled)
                  {
                  tokenSource.Cancel();
                  }



                  I would just use the method in the if statement, like



                  if (IsScripteExecutionCancelled())
                  {
                  tokenSource.Cancel();
                  }


                  if you were going to use this value somewhere else and didn't want it evaluated again, then you could assign it to a variable, but then you need to keep in mind that calling the variable will not run the method.






                  share|improve this answer














                  you create a variable here and use it only once




                  bool taskExecutionCancelled = IsScripteExecutionCancelled();
                  if (taskExecutionCancelled)
                  {
                  tokenSource.Cancel();
                  }



                  I would just use the method in the if statement, like



                  if (IsScripteExecutionCancelled())
                  {
                  tokenSource.Cancel();
                  }


                  if you were going to use this value somewhere else and didn't want it evaluated again, then you could assign it to a variable, but then you need to keep in mind that calling the variable will not run the method.







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Mar 14 at 18:59

























                  answered Mar 14 at 17:45









                  Malachi

                  25.5k773175




                  25.5k773175






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Code Review Stack Exchange!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      Use MathJax to format equations. MathJax reference.


                      To learn more, see our tips on writing great answers.





                      Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                      Please pay close attention to the following guidance:


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f189478%2ftask-execution-with-cancel-logic%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      Ottavio Pratesi

                      Tricia Helfer

                      15 giugno