2

次のコードが与えられた場合、リッチテキストボックスをロックして、別のログ呼び出しが入力を開始する前に各ログ呼び出しが終了するようにするにはどうすればよいでしょうか?

private delegate void ReportLogDelegate(RichTextBox box, Color color, string message);

public void FileLog(string file, string project, string type, string fileNr, string note)
{
    if (type == "incoming")
    {
        this.Invoke(new ReportLogDelegate(this.AppendText), new object[] { logTextBox, Color.Orange, String.Format("{0} - {1}", DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString()) });
        string message = string.Format("\n\tFile Incoming\n\tFile: {0}\n\tProject: {1}\n\tFileNumber: {2}\n\n", file, project, fileNr);
        this.Invoke(new ReportLogDelegate(this.AppendText), new object[] { logTextBox, Color.White, message });
    }
    else if (type == "done")
    {
        this.Invoke(new ReportLogDelegate(this.AppendText), new object[] { logTextBox, Color.GreenYellow, String.Format("{0} - {1}", DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString()) });
        string message = string.Format("\n\tFile Received\n\tFile: {0}\n\tProject: {1}\n\tFileNumber: {2}\n\n", file, project, fileNr);
        this.Invoke(new ReportLogDelegate(this.AppendText), new object[] { logTextBox, Color.White, message });
    }
    else if (type == "error")
    {
        this.Invoke(new ReportLogDelegate(this.AppendText), new object[] { logTextBox, Color.Red, String.Format("{0} - {1}", DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString()) });
        string message = string.Format("\n\tError Receiving File\n\tFile: {0}\n\tProject: {1}\n\tFileNumber: {2}\n\tError: {3}\n\n", file, project, fileNr, note);
        this.Invoke(new ReportLogDelegate(this.AppendText), new object[] { logTextBox, Color.Red, message });
    }
}


// Append text of the given color.
void AppendText(RichTextBox box, Color color, string text)
{
    int start = box.TextLength;
    box.AppendText(text);
    int end = box.TextLength;

    // Textbox may transform chars, so (end-start) != text.Length
    box.Select(start, end - start);
    {
        box.SelectionColor = color;
        // could set box.SelectionBackColor, box.SelectionFont too.
    }
    box.SelectionLength = 0; // clear
}

FileLog への各呼び出しは、別の呼び出しが RTB にアクセスする前に最後まで実行できるようにする必要があります。

4

1 に答える 1

4

lockメソッドの本体全体をブロックに入れるだけです。他のメソッドが同じ同期ロックを使用していないことを確認できるように、ロックする新しいプライベート オブジェクトを作成します。

private object key = new object();
public void FileLog(string file, string project, string type, string fileNr, string note)
{
    lock(key)
    {
        //your existing implementation goes here
    }
}

これは、リッチ テキスト ボックスにアクセスするメソッドが他にないことを前提としています。他のオブジェクトがある場合は、ロックするオブジェクトにすべてのオブジェクトがアクセスできるようにする必要があります。

于 2013-05-13T16:01:02.433 に答える