“跨线程操作无效:从创建它的线程以外的线程访问控件。”

时间:2016-08-26 17:10:02

标签: c#

我正在尝试将某些消息记录到RichTextBox控件。它记录前2或3,然后抛出以下错误:

  

“跨线程操作无效:控制'txtLog'从其创建的线程以外的线程访问。”

这是一个非常简单的应用程序,只需一个订阅。没有尝试线程化。

我在SO上发现了另一个问题,我正在使用字符串构建器:

    public StringBuilder logtext = new StringBuilder();

然后我想简化一些事情,所以我可以打电话给log("this is a log message")

    public void log(string txt)
    {
        logtext.Append(Environment.NewLine + txt);
        txtLog.Text = logtext.ToString();
    }

就像我说的那样,它会记录几个字符串,但之后会尝试记录以下内容:

  

“ConnectStatus:[1,\”已连接\“,”存在\“]”

那是它抛出错误的时候。这是返回该值的代码:

pubnub.Subscribe<string>(
  chnl, 
  DisplayReturnMessage, 
  DisplayConnectStatusMessage, 
  DisplayErrorMessage
);

public void DisplayReturnMessage(string result)
{
    log(TimeStamp() + " Result: " + result);
}

如果它有帮助,这里是调试器的ss:

enter image description here

请忽略TimeStamp()现在字面上返回“H:mm:ss.ffff”的事实:)

我能够手动log("ConnectStatus: [1,\"Connected\",\"presence\"]")并且它有效,所以我不认为这是一个字符串问题。穿线的事情真的让我失望。

1 个答案:

答案 0 :(得分:0)

根据重复的问题,我修改了log()方法:

    public void log(string txt)
    {
        logtext.Append(Environment.NewLine + txt);
        txtLog.Invoke(new Action(delegate { txtLog.Text = logtext.ToString(); }));
    }

现在可行。