ParallelLoopState.Stop 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
告知 Parallel 循环应在系统方便的时候尽早停止执行。
public:
void Stop();
public void Stop ();
member this.Stop : unit -> unit
Public Sub Stop ()
例外
示例
以下示例并行执行循环的最多 10,000 次迭代。 每次迭代暂停 1 到 1,000 毫秒的随机间隔。 随机生成的值确定调用方法的循环 Stop 迭代。 如示例输出所示,调用 Stop 方法后不会执行迭代。
using System;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
var rnd = new Random();
long stopIndex = rnd.Next(1, 11);
Console.WriteLine("Will call Stop in iteration {0}\n", stopIndex);
var result = Parallel.For(1, 10000, (i, state) => {
Console.WriteLine("Beginning iteration {0}", i);
int delay;
Monitor.Enter(rnd);
delay = rnd.Next(1, 1001);
Monitor.Exit(rnd);
Thread.Sleep(delay);
if (i == stopIndex) {
Console.WriteLine("Stop in iteration {0}", i);
state.Stop();
return;
}
if (state.IsStopped) {
return;
}
Console.WriteLine("Completed iteration {0}", i);
});
}
}
// The example displays output like the following:
// Will call Stop in iteration 5
//
// Beginning iteration 1
// Beginning iteration 9993
// Beginning iteration 8744
// Beginning iteration 6246
// Beginning iteration 7495
// Beginning iteration 3748
// Beginning iteration 4997
// Beginning iteration 2499
// Beginning iteration 1250
// Completed iteration 6246
// Beginning iteration 6247
// Completed iteration 3748
// Beginning iteration 3749
// Completed iteration 8744
// Beginning iteration 8745
// Completed iteration 7495
// Beginning iteration 7496
// Completed iteration 1250
// Beginning iteration 1251
// Completed iteration 2499
// Beginning iteration 2500
// Completed iteration 1
// Beginning iteration 2
// Completed iteration 2500
// Beginning iteration 2501
// Completed iteration 3749
// Beginning iteration 3750
// Completed iteration 6247
// Beginning iteration 6248
// Completed iteration 7496
// Beginning iteration 7497
// Completed iteration 3750
// Beginning iteration 3751
// Completed iteration 2
// Beginning iteration 3
// Completed iteration 9993
// Beginning iteration 9994
// Completed iteration 8745
// Beginning iteration 8746
// Completed iteration 4997
// Completed iteration 9994
// Beginning iteration 9995
// Beginning iteration 4998
// Completed iteration 6248
// Beginning iteration 6249
// Completed iteration 7497
// Beginning iteration 7498
// Completed iteration 1251
// Beginning iteration 1252
// Completed iteration 2501
// Beginning iteration 2502
// Completed iteration 9995
// Beginning iteration 9996
// Completed iteration 4998
// Beginning iteration 4999
// Completed iteration 2502
// Beginning iteration 2503
// Completed iteration 1252
// Beginning iteration 1253
// Completed iteration 7498
// Beginning iteration 7499
// Completed iteration 3751
// Beginning iteration 3752
// Completed iteration 9996
// Beginning iteration 9997
// Completed iteration 1253
// Beginning iteration 1254
// Completed iteration 9997
// Beginning iteration 9998
// Completed iteration 1254
// Beginning iteration 1255
// Completed iteration 6249
// Beginning iteration 6250
// Completed iteration 3
// Beginning iteration 4
// Completed iteration 4
// Beginning iteration 5
// Completed iteration 4999
// Beginning iteration 5000
// Completed iteration 8746
// Beginning iteration 8747
// Stop in iteration 5
Imports System.Threading
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim rnd As New Random()
Dim stopIndex As Long = rnd.Next(1, 11)
Console.WriteLine("Will call Stop in iteration {0}", stopIndex)
Console.WriteLine()
Dim result = Parallel.For(1, 10000, Sub(i, state)
Console.WriteLine("Beginning iteration {0}", i)
Dim delay As Integer
Monitor.Enter(rnd)
delay = rnd.Next(1, 1001)
Monitor.Exit(rnd)
Thread.Sleep(delay)
If i = stopIndex Then
Console.WriteLine("Stop in iteration {0}", i)
state.Stop()
Return
End If
If state.IsStopped Then
Return
End If
Console.WriteLine("Completed iteration {0}", i)
End Sub)
End Sub
End Module
' The example displays output like the following:
' Will call Stop in iteration 5
'
' Beginning iteration 1
' Beginning iteration 9993
' Beginning iteration 8744
' Beginning iteration 6246
' Beginning iteration 7495
' Beginning iteration 3748
' Beginning iteration 4997
' Beginning iteration 2499
' Beginning iteration 1250
' Completed iteration 6246
' Beginning iteration 6247
' Completed iteration 3748
' Beginning iteration 3749
' Completed iteration 8744
' Beginning iteration 8745
' Completed iteration 7495
' Beginning iteration 7496
' Completed iteration 1250
' Beginning iteration 1251
' Completed iteration 2499
' Beginning iteration 2500
' Completed iteration 1
' Beginning iteration 2
' Completed iteration 2500
' Beginning iteration 2501
' Completed iteration 3749
' Beginning iteration 3750
' Completed iteration 6247
' Beginning iteration 6248
' Completed iteration 7496
' Beginning iteration 7497
' Completed iteration 3750
' Beginning iteration 3751
' Completed iteration 2
' Beginning iteration 3
' Completed iteration 9993
' Beginning iteration 9994
' Completed iteration 8745
' Beginning iteration 8746
' Completed iteration 4997
' Completed iteration 9994
' Beginning iteration 9995
' Beginning iteration 4998
' Completed iteration 6248
' Beginning iteration 6249
' Completed iteration 7497
' Beginning iteration 7498
' Completed iteration 1251
' Beginning iteration 1252
' Completed iteration 2501
' Beginning iteration 2502
' Completed iteration 9995
' Beginning iteration 9996
' Completed iteration 4998
' Beginning iteration 4999
' Completed iteration 2502
' Beginning iteration 2503
' Completed iteration 1252
' Beginning iteration 1253
' Completed iteration 7498
' Beginning iteration 7499
' Completed iteration 3751
' Beginning iteration 3752
' Completed iteration 9996
' Beginning iteration 9997
' Completed iteration 1253
' Beginning iteration 1254
' Completed iteration 9997
' Beginning iteration 9998
' Completed iteration 1254
' Beginning iteration 1255
' Completed iteration 6249
' Beginning iteration 6250
' Completed iteration 3
' Beginning iteration 4
' Completed iteration 4
' Beginning iteration 5
' Completed iteration 4999
' Beginning iteration 5000
' Completed iteration 8746
' Beginning iteration 8747
' Stop in iteration 5
由于循环迭代在调用 方法时 Stop 仍可能执行,因此每次迭代都会调用 IsStopped 方法,以检查另一个迭代是否调用 Stop 了 方法。 如果返回 true
,迭代将立即返回。
注解
Stop调用 方法指示不需要运行尚未启动的循环的任何迭代。 它有效地取消循环的任何其他迭代。 但是,它不会停止已经开始执行的任何迭代。
Stop调用 方法会导致属性IsStopped返回true
仍在执行的循环的任何迭代。 这对于长时间运行的迭代特别有用,它可以检查 属性并在 IsStopped 其值为 true
时提前退出。
Stop 通常在基于搜索的算法中使用,其中找到结果后,无需执行其他迭代。