Megosztás a következőn keresztül:


streamWriterBufferedDataLost MDA

Feljegyzés

Ez a cikk a .NET-keretrendszer vonatkozik. Ez nem vonatkozik a .NET újabb implementációira, beleértve a .NET 6-os és újabb verzióit.

A streamWriterBufferedDataLost felügyelt hibakeresési segéd (MDA) akkor aktiválódik, amikor a StreamWriter rendszer írásra kerül, de a FlushClose rendszer ezt követően nem hívja meg a metódust a példány megsemmisítése StreamWriter előtt. Ha ez az MDA engedélyezve van, a futtatókörnyezet határozza meg, hogy a pufferelt adatok továbbra is léteznek-e a StreamWriter. Ha a pufferelt adatok léteznek, az MDA aktiválva lesz. A meghívás és WaitForPendingFinalizers a Collect metódusok kényszeríthetik a véglegesítők futtatását. A véglegesítők egyébként látszólag tetszőleges időpontokban futnak, és valószínűleg egyáltalán nem a folyamatból való kilépéskor. A véglegesítők explicit futtatása ezzel az MDA-val engedélyezve segít az ilyen típusú problémák megbízhatóbb reprodukálásában.

Hibajelenségek

Az A StreamWriter nem írja az utolsó 1–4 KB-os adatot egy fájlba.

Ok

A StreamWriter pufferek belsőleg pufferelik az adatokat, ami megköveteli, hogy a CloseFlush pufferelt adatok az alapul szolgáló adattárba való írásához meghívják a metódust. Flush Ha Close nincs megfelelően meghívva, előfordulhat, hogy a StreamWriter példányban pufferelt adatok nem a várt módon lesznek megírva.

Az alábbiakban egy példát mutatunk be a rosszul megírt kódra, amelyet ennek az MDA-nak el kell kapnia.

// Poorly written code.
void Write()
{
    StreamWriter sw = new StreamWriter("file.txt");
    sw.WriteLine("Data");
    // Problem: forgot to close the StreamWriter.
}

Az előző kód megbízhatóbb módon aktiválja ezt az MDA-t, ha egy szemétgyűjtés aktiválódik, majd fel van függesztve, amíg a véglegesítők befejeződnek. Az ilyen típusú probléma nyomon követéséhez hozzáadhatja a következő kódot az előző metódus végéhez egy hibakeresési buildben. Ez segít megbízhatóan aktiválni az MDA-t, de természetesen nem oldja meg a probléma okát.

GC.Collect();
GC.WaitForPendingFinalizers();

Resolution (Osztás)

Győződjön meg arról, hogy meghív Close vagy bekapcsol egy StreamWriter alkalmazást vagy bármely kódblokkot, amely rendelkezik egy példánysalStreamWriterFlush. Ennek elérésére az egyik legjobb módszer a példány létrehozása egy C# using -blokktal (Using a Visual Basicben), amely biztosítja az Dispose író metódusának meghívását, ami a példány megfelelő bezárását eredményezi.

using(StreamWriter sw = new StreamWriter("file.txt"))
{
    sw.WriteLine("Data");
}

Az alábbi kód ugyanazt a megoldást jeleníti meg, ahelyettusing, hogy try/finally a .

StreamWriter sw;
try
{
    sw = new StreamWriter("file.txt"));
    sw.WriteLine("Data");
}
finally
{
    if (sw != null)
        sw.Close();
}

Ha egyik megoldás sem használható (például ha egy StreamWriter statikus változóban van tárolva, és a kód nem futtatható egyszerűen az élettartama végén), akkor az utolsó használat után be kell hívnia FlushStreamWriter a tulajdonságot, vagy az első használat előtt kell beállítania a AutoFlush tulajdonságot true , hogy elkerülje ezt a problémát.

private static StreamWriter log;
// static class constructor.
static WriteToFile()
{
    StreamWriter sw = new StreamWriter("log.txt");
    sw.AutoFlush = true;

    // Publish the StreamWriter for other threads.
    log = sw;
}

Effektus a futtatókörnyezetre

Ez az MDA nincs hatással a futtatókörnyezetre.

Hozam

Egy üzenet, amely jelzi, hogy ez a szabálysértés történt.

Konfiguráció

<mdaConfig>
  <assistants>
    <streamWriterBufferedDataLost />
  </assistants>
</mdaConfig>

Lásd még