次の方法で共有


Thread.EndCriticalRegion メソッド

定義

スレッドの中止または処理されない例外の影響が現在のタスクだけに及ぶコード領域に実行が入ることをホストに通知します。

public:
 static void EndCriticalRegion();
public static void EndCriticalRegion ();
static member EndCriticalRegion : unit -> unit
Public Shared Sub EndCriticalRegion ()

次の例では、 メソッドと EndCriticalRegion メソッドを使用BeginCriticalRegionして、コードブロックをクリティカル領域と非クリティカル領域に分割する方法を示します。

using namespace System::Threading;

public ref class MyUtility
{
public:
   void PerformTask()
   {
      // Code in this region can be aborted without affecting
      // other tasks.
      //
      Thread::BeginCriticalRegion();
      //
      // The host might decide to unload the application domain
      // if a failure occurs in this code region.
      //
      Thread::EndCriticalRegion();
      //
      // Code in this region can be aborted without affecting
      // other tasks.
   }
};
using System.Threading;

public class MyUtility
{
    public void PerformTask()
    {
        // Code in this region can be aborted without affecting
        // other tasks.
        //
        Thread.BeginCriticalRegion();
        //
        // The host might decide to unload the application domain
        // if a failure occurs in this code region.
        //
        Thread.EndCriticalRegion();
        //
        // Code in this region can be aborted without affecting
        // other tasks.
    }
}
open System.Threading

let performTask () =
    // Code in this region can be aborted without affecting
    // other tasks.
    //
    Thread.BeginCriticalRegion()
    //
    // The host might decide to unload the application domain
    // if a failure occurs in this code region.
    //
    Thread.EndCriticalRegion()
    //
    // Code in this region can be aborted without affecting
    // other tasks.
Imports System.Threading

Public Class MyUtility
    Public Sub PerformTask() 
        ' Code in this region can be aborted without affecting
        ' other tasks.
        '
        Thread.BeginCriticalRegion()
        '
        ' The host might decide to unload the application domain
        ' if a failure occurs in this code region.
        '
        Thread.EndCriticalRegion()
        ' Code in this region can be aborted without affecting
        ' other tasks.
    End Sub
End Class

注釈

Microsoft SQL Server 2005 など、共通言語ランタイム (CLR) のホストは、コードのクリティカルリージョンと非クリティカルリージョンでの障害に対して異なるポリシーを確立できます。 クリティカル領域とは、スレッド中止または未処理の例外の影響が現在のタスクに限定されない可能性がある領域です。 これに対し、コードの重要でない領域での中止または失敗は、エラーが発生したタスクにのみ影響します。

たとえば、ロックを保持しながらメモリを割り当てようとするタスクを考えてみましょう。 メモリ割り当てが失敗した場合、ドメイン内に同じロックを待機している他のタスクが存在する可能性があるため、現在の AppDomainタスクを中止するだけでは 十分ではありません。 現在のタスクが終了すると、他のタスクがデッドロックする可能性があります。

重大なリージョンで障害が発生した場合、ホストは、不安定な状態で実行を継続するリスクを負うのではなく、全体 AppDomain をアンロードすることを決定する可能性があります。 コードが重要なリージョンに入っていることをホストに通知するには、 を呼び出します BeginCriticalRegion。 実行が重要でないコード領域に戻ったときに を呼び出 EndCriticalRegion します。

SQL Server 2005 で実行されるコードでこのメソッドを使用するには、コードを最高のホスト保護レベルで実行する必要があります。

適用対象

こちらもご覧ください