SYSLIB0006: Thread.Abort はサポート対象外

.NET 5 以降では、次の API は古い形式としてマークされています。 これらの API を使用すると、コンパイル時には警告 SYSLIB0006 が、実行時には PlatformNotSupportedException が生成されます。

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

回避策

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);
    }
}

警告を抑制する

古い API を使う必要がある場合は、コードまたはプロジェクト ファイルで警告を抑制することができます。

単一の違反だけを抑制するには、ソース ファイルにプリプロセッサ ディレクティブを追加して警告を無効にしてから、再度有効にします。

// Disable the warning.
#pragma warning disable SYSLIB0006

// Code that uses obsolete API.
// ...

// Re-enable the warning.
#pragma warning restore SYSLIB0006

プロジェクトですべての SYSLIB0006 警告を抑制するには、プロジェクト ファイルに <NoWarn> プロパティを追加します。

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
   ...
   <NoWarn>$(NoWarn);SYSLIB0006</NoWarn>
  </PropertyGroup>
</Project>

詳細については、「警告を表示しない」を参照してください。

関連項目