ParallelLoopState.Stop メソッド

定義

システムはできるだけ早く Parallel ループの実行を終了する必要があることを通知します。Communicates that the Parallel loop should cease execution at the system's earliest convenience.

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

例外

Break() メソッドは、既に呼び出されています。The Break() method was called previously. Break()Stop() は、同じループのイテレーションで組み合わせて使用することはできません。Break() and Stop() may not be used in combination by iterations of the same loop.

次の例では、ループの最大1万の反復処理を並列実行します。The following example executes up to 10,000 iterations of a loop in parallel. 各イテレーションは、1 ~ 1000 ミリ秒のランダムな間隔で一時停止します。Each iteration pauses for a random interval from 1 to 1,000 milliseconds. ランダムに生成された値によって、Stop メソッドが呼び出されるループの反復処理が決定されます。A randomly generated value determines on which iteration of the loop the Stop method is called. この例の出力に示されているように、Stop メソッドの呼び出しの後にイテレーションは実行されません。As the output from the example shows, no iterations execute after the call to the Stop method.

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 メソッドを呼び出したかどうかを確認します。Because iterations of the loop are still likely to be executing when the Stop method is called, each iteration calls the IsStopped method to check whether another iteration has called the Stop method. trueが返された場合は、すぐにイテレーションが返されます。If it returns true, the iteration returns immediately.

注釈

Stop メソッドを呼び出すと、まだ開始されていないループの反復処理を実行する必要がなくなります。Calling the Stop method indicates that any iterations of the loop that have not yet started need not be run. ループのその他の反復処理は実質的にキャンセルされます。It effectively cancels any additional iterations of the loop. ただし、実行を既に開始しているイテレーションは停止されません。However, it does not stop any iterations that have already begun execution.

Stop メソッドを呼び出すと、実行中のループの反復処理に対して、IsStopped プロパティによって true が返されます。Calling the Stop method causes the IsStopped property to return true for any iteration of the loop that is still executing. これは、IsStopped プロパティを確認し、その値が true場合に早期に終了できる、長時間実行されるイテレーションに特に便利です。This is particularly useful for long-running iterations, which can check the IsStopped property and exit early if its value is true.

Stop は通常、検索ベースのアルゴリズムで使用されます。結果が見つかった場合は、他のイテレーションを実行する必要はありません。Stop is typically employed in search-based algorithms, where once a result is found, no other iterations need be executed.

適用対象

こちらもご覧ください