İngilizce dilinde oku

Aracılığıyla paylaş


GC.WaitForPendingFinalizers Yöntem

Tanım

Sonlandırıcıların sırasını işleyen iş parçacığı bu kuyruğu boşaltana kadar geçerli iş parçacığını askıya alır.

C#
public static void WaitForPendingFinalizers();

Örnekler

Aşağıdaki örnekte, toplanan tüm nesnelerin sonlandırılması tamamlanana kadar geçerli iş parçacığını askıya almak için yönteminin nasıl kullanılacağı WaitForPendingFinalizers gösterilmektedir.

C#
using System;

namespace WaitForPendingFinalizersExample
{
   class MyWaitForPendingFinalizersClass
   {
    // You can increase this number to fill up more memory.
    const int numMfos = 1000;
    // You can increase this number to cause more
    // post-finalization work to be done.
    const int maxIterations = 100;

    static void Main(string[] args)
    {
       MyFinalizeObject mfo = null;

       // Create and release a large number of objects
       // that require finalization.
       for(int j = 0; j < numMfos; j++)
       {
          mfo = new MyFinalizeObject();
       }

       //Release the last object created in the loop.
       mfo = null;

       //Force garbage collection.
       GC.Collect();

       // Wait for all finalizers to complete before continuing.
       // Without this call to GC.WaitForPendingFinalizers,
       // the worker loop below might execute at the same time
       // as the finalizers.
       // With this call, the worker loop executes only after
       // all finalizers have been called.
       GC.WaitForPendingFinalizers();

       // Worker loop to perform post-finalization code.
       for(int i = 0; i < maxIterations; i++)
       {
          Console.WriteLine("Doing some post-finalize work");
       }
    }
   }

   class MyFinalizeObject
   {
    // Make this number very large to cause the finalizer to
    // do more work.
    private const int maxIterations = 10000;

    ~MyFinalizeObject()
    {
       Console.WriteLine("Finalizing a MyFinalizeObject");
            
       // Do some work.
       for(int i = 0; i < maxIterations; i++)
       {
          // This method performs no operation on i, but prevents
          // the JIT compiler from optimizing away the code inside
          // the loop.
          GC.KeepAlive(i);
       }
        }
    }
}

Açıklamalar

Atık toplayıcı geri kazanılabilir nesneleri bulduğunda, nesnenin sonlandırma gereksinimlerini belirlemek için her nesneyi denetler. Bir nesne bir sonlandırıcı uygularsa ve çağrısı SuppressFinalizeyaparak sonlandırmayı devre dışı bırakmazsa, nesne sonlandırma için hazır olarak işaretlenmiş nesneler listesine yerleştirilir. Çöp toplayıcı, bu listedeki nesnelerin yöntemlerini çağırır Finalize ve girdileri listeden kaldırır. Bu yöntem, tüm sonlandırıcılar tamamlanmak üzere çalıştırılıncaya kadar engeller.

Sonlandırıcıların çalıştırıldığı iş parçacığı belirtilmemiştir, bu nedenle bu yöntemin sonlandırılacağının garantisi yoktur. Ancak, yöntem devam ederken WaitForPendingFinalizers bu iş parçacığı başka bir iş parçacığı tarafından kesilebilir. Örneğin, bir süre bekleyen başka bir iş parçacığı başlatabilir ve bu iş parçacığı hala askıya alınmışsa bu iş parçacığını kesintiye uğratır.

Şunlara uygulanır

Ürün Sürümler
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9, 10
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0