How to cancel the execution of a function in C#

Asked

Viewed 398 times

1

I am developing a C# WPF desktop application in which there is a function responsible for sending email EnviarEmail(), when this function is executed it takes a certain period of time for it to be fully executed. And when it is being executed the whole form is locked, ie it is not possible to do anything.

As it is possible to make a button "Cancel" that when being clicked it cancels the execution of the function EnviarEmail() and when it is executed it is not locked "The cancel button"?

ClickButtonEnviarEmail(){
    EnviarEmail();
}

private void EnviarEmail(){
   .
   . // Enviando Email ~ isso pode demorar um certo tempo, 

 e caso o usuario queira cancelar o envio do email, como é possível
 fazer?
        .
     }

How to solve this problem?

  • I’m finding it a little wide, I’d need to see how you’re doing. But basically you have to create an event on the button that triggers a method that cancels. Obviously it could not have a method "linguição" that makes the sending, or even could but then at each pass in the loop would have to check if the button was triggered, which probably workshop one flag.

  • But for example, what if it’s just sending one email? smtp.Send(mail) to send the email actually for taking a while, and if I want to cancel this submission?

  • Did the answer solve your question? Do you think you can accept it? See [tour] if you don’t know how you do it. This would help a lot to indicate that the solution was useful to you. You can also vote on any question or answer you find useful on the entire site.

1 answer

1

It is possible to do this as shown in documentation. Out of this we’d better get a more complete library. Constant example there:

using System;
using System.Net;
using System.Net.Mail;
using System.Net.Mime;
using System.Threading;
using System.ComponentModel;
namespace Examples.SmptExamples.Async {
    public class SimpleAsynchronousExample {
        static bool mailSent = false;
        private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e) {
            // Get the unique identifier for this asynchronous operation.
             String token = (string) e.UserState;
            if (e.Cancelled) {
                 Console.WriteLine("[{0}] Send canceled.", token);
            }
            if (e.Error != null) {
                 Console.WriteLine("[{0}] {1}", token, e.Error.ToString());
            } else {
                Console.WriteLine("Message sent.");
            }
            mailSent = true;
        }
        public static void Main(string[] args) {
            // Command line argument must the the SMTP host.
            SmtpClient client = new SmtpClient(args[0]);
            // Specify the e-mail sender.
            // Create a mailing address that includes a UTF8 character
            // in the display name.
            MailAddress from = new MailAddress("[email protected]", 
               "Jane " + (char)0xD8+ " Clayton", 
            System.Text.Encoding.UTF8);
            // Set destinations for the e-mail message.
            MailAddress to = new MailAddress("[email protected]");
            // Specify the message content.
            MailMessage message = new MailMessage(from, to);
            message.Body = "This is a test e-mail message sent by an application. ";
            // Include some non-ASCII characters in body and subject.
            string someArrows = new string(new char[] {'\u2190', '\u2191', '\u2192', '\u2193'});
            message.Body += Environment.NewLine + someArrows;
            message.BodyEncoding =  System.Text.Encoding.UTF8;
            message.Subject = "test message 1" + someArrows;
            message.SubjectEncoding = System.Text.Encoding.UTF8;
            // Set the method that is called back when the send operation ends.
            client.SendCompleted += new 
            SendCompletedEventHandler(SendCompletedCallback);
            // The userState can be any object that allows your callback 
            // method to identify this send operation.
            // For this example, the userToken is a string constant.
            string userState = "test message1";
            client.SendAsync(message, userState);
            Console.WriteLine("Sending message... press c to cancel mail. Press any other key to exit.");
            string answer = Console.ReadLine();
            // If the user canceled the send, and mail hasn't been sent yet,
            // then cancel the pending operation.
            if (answer.StartsWith("c") && mailSent == false) {
                client.SendAsyncCancel();
            }
            // Clean up.
            message.Dispose();
            Console.WriteLine("Goodbye.");
        }
    }
}

I put in the Github for future reference.

  • In case my Cancel button would have Sendcompletedcallback as an event ?

  • I don’t know, as I commented, the question doesn’t say anything about your code. But I would say no, it would be something to call client.SendAsyncCancel();. Note that I don’t even know if it solves what you want, it’s a way, but you may need something that allows interaction.

  • sure I could understand the code, but the problem is that when I enter the function to send the email the screen is blocked until the function is completed, how do I so that it does not happen?

  • Then you start to have doubt over doubt. I shouldn’t even have answered. You need to have a more specific but well defined problem. You cast a general doubt, I gave a general answer.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.