ParallelLoopState.Stop 方法

定义

告知 Parallel 循环应在系统方便的时候尽早停止执行。

public:
 void Stop();
public void Stop ();
member this.Stop : unit -> unit
Public Sub Stop ()

例外

以前调用过 Break() 方法。 Break()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 通常在基于搜索的算法中使用,其中找到结果后,无需执行其他迭代。

适用于

另请参阅