Thread.Abort 已過時
Thread.Abort API 已淘汰。 如果呼叫這些方法,以 .NET 5 或更新版本為目標的專案將會遇到編譯時間警告 SYSLIB0006
。
變更描述
之前,對 Thread.Abort 的呼叫不會產生編譯時間警告,不過該方法確實會在執行階段擲回 PlatformNotSupportedException。
從 .NET 5 開始,已將 Thread.Abort 標示為已淘汰的警告。 呼叫這個方法會產生編譯器警告 SYSLIB0006
。 方法的實作不會變更,而且會繼續擲回 PlatformNotSupportedException。
變更原因
假設在所有 .NET 實作上 Thread.Abort 一律會擲回 PlatformNotSupportedException,(但 .NET Framework 除外),ObsoleteAttribute 已新增至該方法,以引起人們對呼叫位置的注意。
當您呼叫 Thread.Abort 以中止目前執行緒以外的執行緒時,您不知道當擲回 ThreadAbortException 時,什麼程式碼已執行或無法執行。 您也無法確定應用程式的狀態,或是任何負責保留的應用程式和使用者狀態。 例如,呼叫 Thread.Abort 可能會阻止執行靜態建構函式,或釋放受控或非受控資源。 因此,Thread.Abort 一律會在 .NET Core 和 .NET 5+ 上擲回 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>