Объект, используемый в настоящее время в другом месте (System.Drawing) - PullRequest
0 голосов
/ 06 октября 2011

Это код, который я запускаю для создания PDF

public string ScreenshotFullLength(string Url) {
    UrlScreenshot Shot = new UrlScreenshot(Url, 975, 100);

    int maxHeight = 1250;
    // If you do skip the crop function you 'll get the
    // full lenght of the page. We'll scale it to match
    // a 400 pixel width
    //int newHeight = (Shot.Bitmap.Width / 400) * Shot.Bitmap.Height;
    //Shot.Resize(400, newHeight);

    string Filename = LazyAssFilename();
    string path = Server.MapPath("~") + "/tmp/" + Filename;
    Shot.Bitmap.Save(path, ImageFormat.Png);

    string pdfURL = "";

    Document document = new Document();

    try {

        // step 2:
        // we create a writer that listens to the document
        // and directs a PDF-stream to a file
        pdfURL = Server.MapPath("~") + "\\tmp\\Attest_" + EOFName + ".pdf";
        PdfWriter.GetInstance(document, new FileStream(pdfURL, FileMode.Create));

        // step 3: we open the document
        document.Open();

        // step 4: we add content
        iTextSharp.text.Image jpg = iTextSharp.text.Image.GetInstance(path);


        if (jpg.Height > maxHeight) {
            //we moeten er meer dan 1 maken en croppen
            int loops = (int)(jpg.Height / maxHeight);
            int rest = (int)(jpg.Height % maxHeight);
            int i;
            for (i = 0; i < loops; i++) {
                Bitmap bmpImage = new Bitmap(path);
                Bitmap bmpCrop = bmpImage.Clone(new System.Drawing.Rectangle(0, i * maxHeight, 975, maxHeight),
                bmpImage.PixelFormat);

                iTextSharp.text.Image crpd = iTextSharp.text.Image.GetInstance(bmpCrop, ImageFormat.Png);
                crpd.Alignment = iTextSharp.text.Image.MIDDLE_ALIGN;
                crpd.ScalePercent(60);
                document.Add(crpd);
            }

            //the rest
            Bitmap bmpImage2 = new Bitmap(path);
            Bitmap bmpCrop2 = bmpImage2.Clone(new System.Drawing.Rectangle(0, i * maxHeight, 975, rest),
            bmpImage2.PixelFormat);

            iTextSharp.text.Image crpdRest = iTextSharp.text.Image.GetInstance(bmpCrop2, ImageFormat.Png);
            crpdRest.Alignment = iTextSharp.text.Image.MIDDLE_ALIGN;
            crpdRest.ScalePercent(60);
            document.Add(crpdRest);

        } else {
            jpg.Alignment = iTextSharp.text.Image.MIDDLE_ALIGN;
            jpg.ScalePercent(60);
            document.Add(jpg);
        }

    } catch (DocumentException de) {
        Console.Error.WriteLine(de.Message);
    } catch (IOException ioe) {
        Console.Error.WriteLine(ioe.Message);
    }

    // step 5: we close the document
    document.Close();

    try {
        //screenshots deleten
        File.Delete(path);
    } catch { }

    return pdfURL;
}

Это работает на веб-сайте, чтобы сделать PDF веб-страницы. Однако, когда несколько человек получают доступ к этому коду с веб-сайта, чтобы сгенерировать свои PDF-файлы, я получаю сообщение об ошибке: Object is currently in use elsewhere.

STACKTRACE: в System.Drawing.Image.Save (имя файла строки, кодер ImageCodecInfo, кодировщик EncoderParametersParams) в ...

Как бы это исправить? Ошибка выдается на Shot.Bitmap.Save(path, ImageFormat.Png);

Ответы [ 2 ]

0 голосов
/ 06 мая 2017

Я столкнулся с той же проблемой, у меня есть рабочий поток, выкачивающий графический интерфейс в его графический интерфейс, но он только иногда выдает это исключение. Обертывание с помощью Invoke исправило это.

_parent.Invoke( new Action(() => eg.Graphics.DrawImage( _icon, rc )));
0 голосов
/ 06 октября 2011

Только что заметил этот вопрос .Один из ответов предполагает, что GDI + не является поточно-ориентированным, и в этом случае вам понадобится блокировка вокруг вашего Save () и, возможно, нескольких других методов.

Просто для подтверждения, прочитав информацию для Image class, хотя неоднозначно, означает ли это один экземпляр или разные экземпляры одного и того же класса.

Любые открытые статические (Shared в Visual Basic) члены этого типапотокобезопасны.Любые члены экземпляра не гарантированно являются потокобезопасными.

...