Время жизни RichTextBox в контексте статического метода - PullRequest
2 голосов
/ 07 октября 2011

Пожалуйста, посмотрите на метод, изображенный ниже

        public static string RemoveRTF(string input)
        {
            string output = input;

            RichTextBox RichTextBox1 = new RichTextBox();
            try {
                RichTextBox1.Rtf = input;
                output = RichTextBox1.Text;
            } catch (ArgumentException argExp) { 
                /*
                 * The supplied input value is not in RTF format. 
                 * Ignore.
                 */
            }
            return output;
        }

Мой вопрос заключается в том, будет ли приведенный выше код при вызове несколько раз генерировать большое количество объектов USER, дескрипторов или объектов GDI.

Причина, по которой я спрашиваю, состоит в том, что у меня есть какой-то код, который отлично работал один день, а затем на следующий день без внесенных изменений перестал работать с сообщенной ошибкой: Ошибка создания дескриптора окна ..

Единственное, что я не могу понять причину проблемы, за исключением того, что стек вызовов показывает мне, что ошибка возникает в приведенном выше коде.

TaskManager не раскрывает большое количество созданных объектов USER или подобных объектов, поэтому я действительно не знаю, что происходит.

Ответы [ 4 ]

3 голосов
/ 07 октября 2011

Вы должны утилизировать RichTextBox, чтобы освободить любые неуправляемые ресурсы.

RichTextBox1.Dispose();
1 голос
/ 07 октября 2011

или вы можете сделать один глобальный RichTextBox и использовать его.

    RichTextBox RichTextBox1 = new RichTextBox();
    public static string RemoveRTF(string input)
            {

    string output = input;

    try {
                    RichTextBox1.Rtf = input;
                    output = RichTextBox1.Text;
RichTextBox1.rtf = null;
                } catch (ArgumentException argExp) { 
                    /*
                     * The supplied input value is not in RTF format. 
                     * Ignore.
                     */
                }
                return output;
            }

или используйте, используя ()

0 голосов
/ 28 ноября 2013

Я также получил ту же ошибку, с которой вы столкнулись при «Ошибка создания дескриптора окна». Эта проблема возникает из-за того, что даже если мы создадим объект RichTextBox и установим для этого объекта значение NULL в конце метода, он не будет утилизирован и поэтому изначально он будет работать нормально, а затем он начнет давать «дескриптор окна создания ошибки». Поэтому вместо этого используйте «Использование». Он будет располагать объект richTextBox вне контекста «using». Это решит эту ошибку.

private String RemoveRtf (String RtfScript) { строка PlainText = null;

        try
        {
            if (!String.IsNullOrEmpty(RtfScript))
            {

                using (RichTextBox richTxtBox = new RichTextBox())
                {


                    richTxtBox.Rtf = RtfScript;

                    PlainText = richTxtBox.Text;
                }
            }
        }
        catch (Exception ex)
        {
            // log error here
        }
        finally
        {
            RtfScript = null;

        }
        return PlainText;
    }
0 голосов
/ 07 октября 2011

Объект RichTextBox работает только в потоке пользовательского интерфейса. Вызов этого кода из фонового потока вызовет исключение с сообщением типа «Ошибка создания дескриптора окна ...»

...