2

System.Windows.Forms.RichTextBox を使用して RTF ファイルを読み取るために、C# で DLL を作成しました。RTF ファイル名を受け取った後、属性のないファイルからテキストだけを返します。

コードは以下のように提供されます。

namespace RTF2TXTConverter
{
    public interface IRTF2TXTConverter
    {
         string Convert(string strRTFTxt);

    };

    public class RTf2TXT : IRTF2TXTConverter
    {
        public string Convert(string strRTFTxt)
        {
            string path = strRTFTxt;

            //Create the RichTextBox. (Requires a reference to System.Windows.Forms.)
            System.Windows.Forms.RichTextBox rtBox = new System.Windows.Forms.RichTextBox();

            // Get the contents of the RTF file. When the contents of the file are   
            // stored in the string (rtfText), the contents are encoded as UTF-16.  
            string rtfText = System.IO.File.ReadAllText(path);

            // Display the RTF text. This should look like the contents of your file.
            //System.Windows.Forms.MessageBox.Show(rtfText);

            // Use the RichTextBox to convert the RTF code to plain text.
            rtBox.Rtf = rtfText;
            string plainText = rtBox.Text;

            //System.Windows.Forms.MessageBox.Show(plainText);

            // Output the plain text to a file, encoded as UTF-8. 
            //System.IO.File.WriteAllText(@"output.txt", plainText);

            return plainText;
        }
    }
}

Convert メソッドは、RTF ファイルからプレーンテキストを返します。VC++ アプリケーションでは、RTF ファイルをロードするたびにメモリ使用量が増加します

増加しています。各反復の後、メモリ使用量は 1 MB ずつ増加します。

使用後に DLL をアンロードし、新しい RTF ファイルを再度ロードする必要がありますか? RichTextBox コントロールは常にメモリに保持されますか? または他の理由....

私たちは多くのことを試しましたが、解決策を見つけることができません。

4

1 に答える 1

1

同様の問題に遭遇しました。Rich Text Box コントロールを常に作成すると、いくつかの問題が発生する可能性があります。大量のデータ セットに対してこのメ​​ソッドを繰り返し実行する場合に遭遇するもう 1 つの大きな問題はrtBox.Rtf = rtfText;、コントロールが最初に使用されるときに行が完了するまでに長い時間がかかることです (いくつかの遅延読み込みが発生します)。最初にテキストを設定するまで発生しない背景)。

これを回避するには、後続の呼び出しでコントロールを再利用します。これにより、コストのかかる初期化コストを 1 回支払うだけで済みます。これは私が使用したコードのコピーです。私はマルチスレッド環境で作業していたので、実際にThreadLocal<RichTextBox>はコントロールを古いものに使用しました。

//reuse the same rtfBox object over instead of creating/disposing a new one each time ToPlainText is called
static ThreadLocal<RichTextBox> rtfBox = new ThreadLocal<RichTextBox>(() => new RichTextBox());

public static string ToPlainText(this string sourceString)
{
    if (sourceString == null)
        return null;

    rtfBox.Value.Rtf = sourceString;
    var strippedText = rtfBox.Value.Text;
    rtfBox.Value.Clear();

    return strippedText;
}

スレッド ローカルのリッチ テキスト ボックスを再利用することで、呼び出しごとに 1 MB の一定の増加が止まるかどうかを確認します。

于 2013-09-11T06:57:00.987 に答える