다음을 통해 공유


Thread.Abort는 사용되지 않음

Thread.Abort API는 사용되지 않습니다. 해당 메서드가 호출되는 경우 .NET 5 이상 버전을 대상으로 하는 프로젝트에서는 컴파일 시간 경고 SYSLIB0006이 발생합니다.

변경 내용 설명

이전에는 Thread.Abort 호출이 컴파일 시간 경고가 생성되지 않았지만 해당 메서드는 런타임에 PlatformNotSupportedException을 throw했습니다.

.NET 5부터 Thread.Abort는 경고로 사용되지 않는 것으로 표시됩니다. 해당 메서드를 호출하면 컴파일러 경고 SYSLIB0006이 생성됩니다. 메서드의 구현은 변경되지 않으며 계속해서 PlatformNotSupportedException을 throw합니다.

변경 이유

Thread.Abort가 .NET Framework를 제외한 모든 .NET 구현에서 항상 PlatformNotSupportedException을 throw하는 것을 고려하여 메서드가 호출된 위치로 주의를 끌기 위해 ObsoleteAttribute가 메서드에 추가되었습니다.

현재 스레드가 아닌 다른 스레드를 중단하기 위해 Thread.Abort를 호출하는 경우 ThreadAbortException이 throw될 때 실행되었거나 실행하지 못한 코드를 알 수 없습니다. 또한 애플리케이션의 상태 또는 유지를 담당하는 애플리케이션 및 사용자 상태를 확신할 수 없습니다. 예를 들어 Thread.Abort를 호출하면 정적 생성자가 실행되거나 관리되거나 관리되지 않는 리소스가 해제되지 않을 수 있습니다. 이러한 이유로 Thread.Abort는 항상 .NET Core 및 .NET 5 이상에서 PlatformNotSupportedException을 throw합니다.

도입된 버전

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