C#:如何从循环外部停止 for 循环的执行?



我有一个类,它使用固定的缓冲区大小从大文件(1GB)读取数据并将其写入数组中。 我想让用户随时取消该过程。 如何从循环外部停止循环。 我认为使用事件是个好主意,但不知道如何做)

注意:我有一份表格可以发送取消请求。

for (int i = 0; i < fileContent.Length; i++)
{
try
{
fileContent[i] = br.ReadInt16();
}
catch (EndOfStreamException)
{
loadflag = 1;
contentSize = i;
break;
}
}
for (int k = 0; k < contentSize; k += ReSampleRate)
{
try
{
convertedData[(count * fileContent.Length / ReSampleRate) + j] = fileContent[k];
j++;
}
catch (IndexOutOfRangeException)
{
MessageBox.Show("could not load the file completely");
goto lable;
}
catch
{
MessageBox.Show("something went wrong");
}
}

if (loadflag == 1)
{
break;
}
}

让你的方法采取CancellationToken。更改循环,使其cancellationToken.ThrowIfCancellationRequested()每次迭代调用。确保调用方捕获生成的操作已取消异常。窗体应创建一个CancellationTokenSource,其中包含可提供给方法的 Token 属性,以及可由窗体调用的取消方法。

请注意,您的方法需要在后台线程上运行才能使所有这些工作正常工作,通常使用Task.Run,但这需要您将消息框和更新 UI 的任何其他代码移动到要取消的方法之外。一个可能的例外情况是,如果你有一个主要等待 IO 完成的异步方法。

例:

private CancellationTokenSource cts = new CancellationTokenSource();;
public async void OnButtonPress(){
try{
cts = new CancellationTokenSource();
await Task.Run(() => OnBackgroundThread(cts.Token));
void OnBackgroundThread(CancellationToken cancel){
foreach(var item in MyItemsToProcess){
cancel.ThrowIfCancellationRequested();
// Process item
}
}
catch(OperationCancelledException){
// do nothing
}
// Handle other errors
}
}
public void OnCancelPress(){
cts.Cancel();
}

另一种变体是检查cancellationToken.IsCancellationRequested属性并正常返回。但是这使得调用方无法确定循环是否完成,充其量只能检查令牌是否已取消。

如果您正在寻找某种方法来取消循环而不对其进行任何更改,那么您就不走运了。没有不合作中止正在运行的线程的好方法。

最新更新