2024/02/10

Control.Invokeの使い方

あちこちでInvokeの使い方が書かれてます。しかし、ちょっと苦労しました。頭が悪いのか、そもそもの説明が悪いのかは別として、やっと使えたのでメモします。今回の場合はMicrosoft.ML.AutoMLのIMonitorからの派生(?)クラスにRichTextBoxを渡してログ出力する際にSystem.InvalidOperationExceptionとなるのを回避する為にInvokeが必要でした。単純に

richTextBox1.AppendText("Logging");

的にしているとダメなのでログ出力する為のメソッドを用意します。

delegate void LoggingDelegate(string log);
private void Logging(string log)
{
    if (richTextBox1.InvokeRequired)
    {
        LoggingDelegate d = new LoggingDelegate(Logging);
        richTextBox1.Invoke(d, new object[] { log });
    }
    else
    {
        richTextBox.Append(log);
    }
}

こんな感じで書くようです。別タスクからアクセスするコントロール毎に用意するのかなぁ。今回RichTextBoxとLabelが在ったのでそれぞれに用意しました。で、

Logging("Logging");

として出力する様に修正して無事に行けました😁

0 件のコメント:

コメントを投稿