停止c#方法的执行

本文关键字:执行 方法 停止 | 更新日期: 2023-09-27 18:16:42

当我点击一个按钮时,我如何能够停止我的方法的执行?

  public void ForEach()
    {
        CreateFolders();
        //For each process get the equivalent processcode
        foreach (string item in Processes)
        {
            ItemValue = item;
            //Get process code for the process under the selected source
            GetActiveProcess();
            #region Switch
            switch (ProcessCode)
            {
                #region DownloadFile
                case "Download File":
                    ForDownloadFile();
                    break;
                #endregion
                #region UnzipFile
                case "Unzip File":
                    ForUnzipFile();
                    break;
                #endregion
                #region RenameFile
                case "Rename File":
                    ForRenameFile();
                    break;
                #endregion
                #region MergeFile
                case "Merge File":
                    ForMergeFile();
                    break;
                #endregion
                #region ZipFile
                case "Zip File":
                    ForZipFile();
                    break;
                #endregion
                #region UploadFile
                case "Upload File":
                    ForUploadFile();
                    break;
                #endregion
            }
            #endregion
        }

    }

我如何结束我的公共void foreach当我点击停止按钮。我想停止下载,或提取文件等每当我点击停止而不关闭我的应用程序。

我已经尝试使用返回,但它继续执行(下载/提取等)。

停止c#方法的执行

你不能停止单个方法的执行。您可以通过使用线程来使用它。使用一个新线程来运行该方法,然后单击按钮通知线程停止。看看这个线程- c#线程-如何启动和停止一个线程http://msdn.microsoft.com/en-us/library/7a2f3ay4 (v =应用程序). aspx

快捷的解决方案可能是为变量引入测试,并通过按停止按钮设置该变量。请注意,这只适用于WinForm应用程序,对于WPF应用程序,您需要导入system.windows.forms.dll -有效地使其非WPF。

例如:

bool stop = false;
foreach (string item in Processes)
{
    if (stop)
        break;
    //do-your-stuff
    Application.DoEvents(); //this will force the winform app to handle events from the GUI
}
//Add an eventhandler to your stop-button
private void stopButton_Click(System.Object sender, System.EventArgs e)
{
    stop = true;
}

但是,正如Rabi建议的那样,在应用程序中引入一些线程会更好。对于WPF, Dispatcher可以创造奇迹。

停止ForEach()应该很容易,但是停止每个Case定义的每个方法取决于您在这种情况下正在做什么。

// Defined somewhere which is available to you ForEach() and your Stop button.
// In the stop button set the KeepProcessing to false.
bool KeepProcessing = true;   
foreach (string item in Processes)
{
    if(!KeepProcessing)
         return;
    switch(.....
}

取消工作线程执行的最规范技术是称为Cooperative cancel 的模式。MSDN上有一篇很好的文章。注意,这与使用基于任务的异步编程有关。

要点与此相似:

public void DoWork(IEnumerable<Work> workItems, ref bool cancel)
{
    foreach(thing in workItems)
    {
        //poll to see if you need to abandon the work.
        if(cancel)
            throw new WorkCancelledException(); //or whatever exception you want to use. MSDN shows you a built in one.
        ProcessThing(thing); //process the item. An item is just a unit of work. You dont have to use a collection of work items.
    }
}

当取消按钮被按下时,设置取消布尔值。MSDN示例使用CancellationToken,我推荐使用它。它不限于Task的实现。

为什么它是合作的?消费代码和执行代码必须同意取消的方法,并同意当cancel为真时取消操作。

我不习惯Wpf,但我认为使用BackGroundWorker是一个正确的解决方案,如果你需要使用一个线程。

https://stackoverflow.com/a/5483644/906404

private readonly BackgroundWorker worker = new BackgroundWorker();
// Initialization code
worker.DoWork += worker_DoWork;
worker.WorkerSupportsCancellation = true;
worker.RunWorkerAsync();          // Runs your code in a background thread
private void worker_DoWork(object sender, DoWorkEventArgs e)  
{
    CreateFolders();
    //For each process get the equivalent processcode
    foreach (string item in Processes)
    {
   -->> if (worker.CancellationPending) break;
        ItemValue = item;
        //Get process code for the process under the selected source
        GetActiveProcess();

        ... your code... 
    }
}
void OnClickStopButton(args) {
   worker.CancelAsync();
}