MemoryFailPoint Sınıf

Tanım

bir işlemi yürütmeden önce yeterli bellek kaynaklarını denetler. Bu sınıf devralınamaz.

public ref class MemoryFailPoint sealed : System::Runtime::ConstrainedExecution::CriticalFinalizerObject, IDisposable
public sealed class MemoryFailPoint : System.Runtime.ConstrainedExecution.CriticalFinalizerObject, IDisposable
type MemoryFailPoint = class
    inherit CriticalFinalizerObject
    interface IDisposable
Public NotInheritable Class MemoryFailPoint
Inherits CriticalFinalizerObject
Implements IDisposable
Devralma
Uygulamalar

Örnekler

MemoryFailPoint , bir uygulamanın belleğin bozuk bir şekilde tükenmesini önlemek için kendisini yavaşlatmasını sağlar. Sözcük temelli bir kapsam içinde kullanılmalıdır. Aşağıdaki örnek, iş kuyruğundaki öğeleri işlemek için iş parçacıklarını başlatır. Her iş parçacığı başlatılmadan önce kullanılabilir bellek kaynakları kullanılarak MemoryFailPointdenetleniyor. Bir özel durum oluşursa, ana yöntem bir sonraki iş parçacığını başlatmadan önce bellek kullanılabilir olana kadar bekler.

using System;
using System.Runtime;
using System.IO;
using System.Threading;
using System.Collections.Generic;
using System.Collections;

class MemoryFailPointExample
{
    // Allocate in chunks of 64 megabytes.
    private const uint chunkSize = 64 << 20;
    // Use more than the total user-available address space (on 32 bit machines)
    // to drive towards getting an InsufficientMemoryException.
    private const uint numWorkItems = 1 + ((1U << 31) / chunkSize);
    static Queue workQueue = new Queue(50);

    // This value can be computed separately and hard-coded into the application.
    // The method is included to illustrate the technique.
    private static int EstimateMemoryUsageInMB()
    {
        int memUsageInMB = 0;

        long memBefore = GC.GetTotalMemory(true);
        int numGen0Collections = GC.CollectionCount(0);
        // Execute a test version of the method to estimate memory requirements.
        // This test method only exists to determine the memory requirements.
        ThreadMethod();
        // Includes garbage generated by the worker function.
        long memAfter = GC.GetTotalMemory(false);
        // If a garbage collection occurs during the measuring, you might need a greater memory requirement.
        Console.WriteLine("Did a GC occur while measuring?  {0}", numGen0Collections == GC.CollectionCount(0));
        // Set the field used as the parameter for the MemoryFailPoint constructor.
        long memUsage = (memAfter - memBefore);
        if (memUsage < 0)
        {
            Console.WriteLine("GC's occurred while measuring memory usage.  Try measuring again.");
            memUsage = 1 << 20;
        }

        // Round up to the nearest MB.
        memUsageInMB = (int)(1 + (memUsage >> 20));
        Console.WriteLine("Memory usage estimate: {0} bytes, rounded to {1} MB", memUsage, memUsageInMB);
        return memUsageInMB;
    }

    static void Main()
    {
        Console.WriteLine("Attempts to allocate more than 2 GB of memory across worker threads.");
        int memUsageInMB = EstimateMemoryUsageInMB();

        // For a production application consider using the threadpool instead.
        Thread[] threads = new Thread[numWorkItems];
        // Create a work queue to be processed by multiple threads.
        int n = 0;
        for (n = 0; n < numWorkItems; n++)
            workQueue.Enqueue(n);
        // Continue to launch threads until the work queue is empty.
        while (workQueue.Count > 0)
        {
            Console.WriteLine(" GC heap (live + garbage): {0} MB", GC.GetTotalMemory(false) >> 20);
            MemoryFailPoint memFailPoint = null;
            try
            {
                // Check for available memory.
                memFailPoint = new MemoryFailPoint(memUsageInMB);
                n = (int)workQueue.Dequeue();
                threads[n] =
                    new Thread(new ParameterizedThreadStart(ThreadMethod));
                WorkerState state = new WorkerState(n, memFailPoint);
                threads[n].Start(state);
                Thread.Sleep(10);
            }
            catch (InsufficientMemoryException e)
            {
                // MemoryFailPoint threw an exception, handle by sleeping for a while,  then
                // continue processing the queue.
                Console.WriteLine("Expected InsufficientMemoryException thrown.  Message: " + e.Message);
                // We could optionally sleep until a running worker thread
                // has finished, like this:  threads[joinCount++].Join();
                Thread.Sleep(1000);
            }
        }

        Console.WriteLine("WorkQueue is empty - blocking to ensure all threads quit (each thread sleeps for 10 seconds)");
        foreach (Thread t in threads)
            t.Join();
        Console.WriteLine("All worker threads are finished - exiting application.");
    }

    // Test version of the working code to determine memory requirements.
    static void ThreadMethod()
    {
        byte[] bytes = new byte[chunkSize];
    }

    internal class WorkerState
    {
        internal int _threadNumber;
        internal MemoryFailPoint _memFailPoint;

        internal WorkerState(int threadNumber, MemoryFailPoint memoryFailPoint)
        {
            _threadNumber = threadNumber;
            _memFailPoint = memoryFailPoint;
        }

        internal int ThreadNumber
        {
            get { return _threadNumber; }
        }

        internal MemoryFailPoint MemoryFailPoint
        {
            get { return _memFailPoint; }
        }
    }

    // The method that does the work.
    static void ThreadMethod(Object o)
    {
        WorkerState state = (WorkerState)o;
        Console.WriteLine("Executing ThreadMethod, " +
            "thread number {0}.", state.ThreadNumber);
        byte[] bytes = null;
        try
        {
            bytes = new byte[chunkSize];
            // Allocated all the memory needed for this workitem.
            // Now dispose of the MemoryFailPoint, then process the workitem.
            state.MemoryFailPoint.Dispose();
        }
        catch (OutOfMemoryException oom)
        {
            Console.Beep();
            Console.WriteLine("Unexpected OutOfMemory exception thrown: " + oom);
        }

        // Do work here, possibly taking a lock if this app needs
        // synchronization between worker threads and/or the main thread.

        // Keep the thread alive for awhile to simulate a running thread.
        Thread.Sleep(10000);

        // A real thread would use the byte[], but to be an illustrative sample,
        // explicitly keep the byte[] alive to help exhaust the memory.
        GC.KeepAlive(bytes);
        Console.WriteLine("Thread {0} is finished.", state.ThreadNumber);
    }
}

Açıklamalar

Note

Bu sınıf, gelişmiş geliştirmede kullanılmak üzere tasarlanmıştır.

sınıfının bir örneğini MemoryFailPoint oluşturmak bir bellek kapısı oluşturur. Bellek kapısı, büyük miktarda bellek gerektiren bir etkinliği başlatmadan önce yeterli kaynakları denetler. Denetimin başarısız olması, bir InsufficientMemoryException özel durumun oluştuğuna neden olur. Bu özel durum, bir işlemin başlatılmasını engeller ve kaynak eksikliği nedeniyle hata olasılığını azaltır. Bu, bir OutOfMemoryException özel durumu ve kodunuzda rastgele konumlarda özel durumun yanlış işlenmesinden kaynaklanan durum bozulmalarını önlemek için performansı azaltmanıza olanak tanır.

Important

Bu tür IDisposable arabirimini uygular. Kullanımını bitirdiğinizde, doğrudan ya da dolaylı yoldan atmalısınız. Türü doğrudan atabilmek için, bir Disposetry/ bloğunda catch yöntemini çağırın. Bunu dolaylı olarak atmak için using (C#'de) veya Using (Visual Basic'te) gibi bir dil yapısı kullanın. Daha fazla bilgi için arabirim konusunun "IDisposable Uygulayan Bir Nesne Kullanma" bölümüne IDisposable bakın.

Bir uygulama, özel InsufficientMemoryException durum oluşturarak bir işlemin tamamlanamadısına ilişkin tahminle uygulama durumunu bozmuş olabilecek kısmen tamamlanmış bir işlemi ayırt edebilir. Bu, bir uygulamanın kötümser bir yükseltme ilkesinin sıklığını azaltmasına olanak tanır ve bu da geçerli AppDomain işlemin kaldırılmasını veya geri dönüştürülmesini gerektirebilir.

MemoryFailPoint tüm çöp toplama yığınlarında yeterli bellek ve ardışık sanal adres alanı olup olmadığını denetler ve takas dosyasının boyutunu artırabilir. MemoryFailPointgeçidin ömrü boyunca belleğin uzun süreli kullanılabilirliği konusunda hiçbir garanti vermese de çağıranların her zaman ile MemoryFailPoint ilişkili kaynakların serbest bırakıldığından emin olmak için yöntemini kullanması Dispose gerekir.

Bellek geçidi kullanmak için bir MemoryFailPoint nesne oluşturmanız ve sonraki işlemin kullanması beklenen megabayt (MB) bellek sayısını belirtmeniz gerekir. Yeterli bellek yoksa, bir InsufficientMemoryException özel durum oluşturulur.

Oluşturucunun parametresi pozitif bir tamsayı olmalıdır. Negatif bir değer veya 0 özel durum ArgumentOutOfRangeException oluşturur.

MemoryFailPoint 16 MB'lık bir ayrıntı düzeyinde çalışır. 16 MB'tan küçük değerler 16 MB, diğer değerler ise 16 MB'ın sonraki en büyük katı olarak değerlendirilir.

Oluşturucular

Name Description
MemoryFailPoint(Int32)

Başarılı yürütme için gereken bellek miktarını belirterek sınıfının yeni bir örneğini MemoryFailPoint başlatır.

Yöntemler

Name Description
Dispose()

tarafından MemoryFailPointkullanılan tüm kaynakları serbest bırakır.

Equals(Object)

Belirtilen nesnenin geçerli nesneye eşit olup olmadığını belirler.

(Devralındığı yer: Object)
Finalize()

Atık toplayıcı nesneyi geri kazandığında kaynakların serbest kalmasını ve diğer temizleme işlemlerinin gerçekleştirilmesini MemoryFailPoint sağlar.

GetHashCode()

Varsayılan karma işlevi işlevi görür.

(Devralındığı yer: Object)
GetType()

Geçerli örneğin Type alır.

(Devralındığı yer: Object)
MemberwiseClone()

Geçerli Objectbasit bir kopyasını oluşturur.

(Devralındığı yer: Object)
ToString()

Geçerli nesneyi temsil eden bir dize döndürür.

(Devralındığı yer: Object)

Şunlara uygulanır