停止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#线程-如何启动和停止一个线程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/906404private 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();
}