Thread.Abort は古い形式

Thread.Abort API は非推奨になっています。 .NET 5 以降のバージョンを対象とするプロジェクトでは、これらのメソッドが呼び出されると、コンパイル時の警告 SYSLIB0006 が発生します。

変更内容

以前は、Thread.Abort を呼び出したときにコンパイル時の警告は生成されませんでしたが、このメソッドによって実行時に PlatformNotSupportedException がスローされていました。

.NET 5 以降、Thread.Abort は警告として古い形式を示すマークが付けられるようになりました。 このメソッドを呼び出すと、コンパイラの警告 SYSLIB0006 が生成されます。 メソッドの実装は変更されず、引き続き PlatformNotSupportedException がスローされます。

変更理由

Thread.Abort により、.NET Framework を除くすべての .NET 実装で常に PlatformNotSupportedException がスローされることを考慮して、呼び出される場所に注意を促すためにメソッドに ObsoleteAttribute が追加されました。

現在のスレッド以外のスレッドを中止するために Thread.Abort を呼び出すと、ThreadAbortException がスローされたときにどのコードが実行されたか、または実行に失敗したかがわかりません。 また、お使いのアプリケーションの状態や、保持する責任がある任意のアプリケーションやユーザーの状態を特定することもできません。 たとえば、Thread.Abort を呼び出すと、静的コンストラクターの実行や、マネージドまたはアンマネージド リソースの解放が妨げられる場合があります。 このため、.NET Core と .NET 5 以降では、Thread.Abort によって PlatformNotSupportedException が常にスローされます。

導入されたバージョン

5.0

  • Thread.Abort を呼び出す代わりに、CancellationToken を使用して作業単位の処理を中止します。 次の例は、CancellationTokenの使用方法を示しています。

    void ProcessPendingWorkItemsNew(CancellationToken cancellationToken)
    {
        if (QueryIsMoreWorkPending())
        {
            // If the CancellationToken is marked as "needs to cancel",
            // this will throw the appropriate exception.
            cancellationToken.ThrowIfCancellationRequested();
    
            WorkItem work = DequeueWorkItem();
            ProcessWorkItem(work);
        }
    }
    

    詳細については、「マネージド スレッドのキャンセル」を参照してください。

  • コンパイル時の警告が表示されないようにするには、警告コード SYSLIB0006 を抑制します。 警告コードは Thread.Abort に固有であり、これを抑制しても、コード内の他の非推奨警告は抑制されません。 しかし、警告を抑制するのではなく、Thread.Abort の呼び出しを削除することをお勧めします。

    void MyMethod()
    {
    #pragma warning disable SYSLIB0006
        Thread.CurrentThread.Abort();
    #pragma warning restore SYSLIB0006
    }
    

    また、プロジェクト ファイルで警告を抑制することもできます。

    <PropertyGroup>
      <OutputType>Exe</OutputType>
      <TargetFramework>net5.0</TargetFramework>
      <!-- Disable "Thread.Abort is obsolete" warnings for entire project. -->
      <NoWarn>$(NoWarn);SYSLIB0006</NoWarn>
    </PropertyGroup>
    

影響を受ける API