private void CreateWorkers()
        {
            // Create all the writers first
            iPageIndex            = new HeapToHTMLPageIndex(iReconstructor, PageFileNameEnsuringPathExists("Index"));
            iPageIndex.iObserver += new AsyncTextWriterBase.Observer(WriterObserver);
            //
            string entireListingFileNameByAddress = HeapToHTMLPageEntireListing.PageFileName(HeapToHTMLPageEntireListing.TSortType.ESortTypeByAddress);

            entireListingFileNameByAddress         = PageFileNameEnsuringPathExists(entireListingFileNameByAddress, iBaseOutputPath, string.Empty, string.Empty);
            iPageEntireListingByAddress            = new HeapToHTMLPageEntireListing(iReconstructor, HeapToHTMLPageEntireListing.TSortType.ESortTypeByAddress, entireListingFileNameByAddress);
            iPageEntireListingByAddress.iObserver += new AsyncTextWriterBase.Observer(WriterObserver);
            //
            string entireListingFileNameByType = HeapToHTMLPageEntireListing.PageFileName(HeapToHTMLPageEntireListing.TSortType.ESortTypeByType);

            entireListingFileNameByType         = PageFileNameEnsuringPathExists(entireListingFileNameByType, iBaseOutputPath, string.Empty, string.Empty);
            iPageEntireListingByType            = new HeapToHTMLPageEntireListing(iReconstructor, HeapToHTMLPageEntireListing.TSortType.ESortTypeByType, entireListingFileNameByType);
            iPageEntireListingByType.iObserver += new AsyncTextWriterBase.Observer(WriterObserver);
            //
            string entireListingFileNameByLength = HeapToHTMLPageEntireListing.PageFileName(HeapToHTMLPageEntireListing.TSortType.ESortTypeByLength);

            entireListingFileNameByLength         = PageFileNameEnsuringPathExists(entireListingFileNameByLength, iBaseOutputPath, string.Empty, string.Empty);
            iPageEntireListingByLength            = new HeapToHTMLPageEntireListing(iReconstructor, HeapToHTMLPageEntireListing.TSortType.ESortTypeByLength, entireListingFileNameByLength);
            iPageEntireListingByLength.iObserver += new AsyncTextWriterBase.Observer(WriterObserver);
            //
            iPageHeapCellManager            = new HeapToHTMLPageHeapCellManager(iReconstructor, iBaseOutputPath);
            iPageHeapCellManager.iObserver += new AsyncTextWriterBase.Observer(WriterObserver);
            //
            iPageJavaScriptManager            = new HeapToHTMLPageJavaScriptManager(iReconstructor, iBaseOutputPath);
            iPageJavaScriptManager.iObserver += new AsyncTextWriterBase.Observer(WriterObserver);

            // Reset their completion statuses so that we're ready to start anew
            ResetCompletionStatuses();

            // Now it's safe to start all the writers running.
            iPageIndex.AsyncWrite();
            iPageEntireListingByAddress.AsyncWrite();
            iPageEntireListingByType.AsyncWrite();
            iPageEntireListingByLength.AsyncWrite();
            iPageHeapCellManager.AsyncWrite();
            iPageJavaScriptManager.AsyncWrite();
        }
        private void MakeAddressLink(HeapCell aCell)
        {
            string fileName = HeapToHTMLPageHeapCellManager.HeapCellFileName(aCell);
            string subDir   = HeapToHTMLPageHeapCellManager.HeapCellDirectory(aCell, string.Empty, '/');

            string heapCellDataPageUrl       = "./HeapData" + subDir + "/" + fileName + ".html";
            string heapCellLinkedCellPageUrl = "./HeapLinkInfo" + subDir + "/" + fileName + ".html";

            StringBuilder line = new StringBuilder();

            line.Append("<A ");
            line.Append("TARGET=\"HeapCellData\" ");
            line.Append("HREF=\"");
            line.Append(heapCellDataPageUrl);
            line.Append("\" ");
            line.Append("onClick=\"parent.HeapLinkInfo.location=\'" + heapCellLinkedCellPageUrl + "\'\"");
            line.Append(">");
            line.Append("0x" + fileName);
            line.Append("</A>");
            Writer.Write(line.ToString());
        }