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
推奨されるアクション
CancellationTokenを呼び出す代わりに、Thread.Abortを使用して作業単位の処理を中止します。 次の例は、 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
.NET