1

我有一个RichTextbox,我正在尝试使用

public bool SaveNote(string path)
{
    try
    {
        _rtbContent.SaveFile(path, RichTextBoxStreamType.RichText);
        return true;
    }
    catch
    {
        return false;
    }
}

在我开始使用后台工作线程之前,它工作正常。现在正在从后台工作人员调用此方法,现在我收到一个错误

Cross-thread operation not valid: Control 'rtbContent' accessed from a thread other than the thread it was created on.

我认为我们必须使用_rtbContent.Invoke但未能正确调用它。我尝试的是

if(_rtbContent.InvokeRequired)
    _rtbContent.Invoke(new MethodInvoker(_rtbContent.SaveFile(path, RichTextBoxStreamType.RichText)));

在这里我收到Method name expected编译错误_rtbContent.SaveFile(path, RichTextBoxStreamType.RichText)

我对使用这些线程不是很舒服,但最近开始研究它们。谁能帮我解决这个问题?

4

2 回答 2

0

使用回调:

delegate void SaveNoteCallback(string path);

public void SaveNote(string path)
{
    if(_rtbContent.InvokeRequired)
    {
        SaveNoteCallback d = new SaveNoteCallback(SaveNote);
        this.Invoke(d, new object[] {path});
    }
    else 
    {
        _rtbContent.SaveFile(path, RichTextBoxStreamType.RichText);    
    }
}
于 2013-04-08T07:45:04.670 回答
0

我得到了另一个有趣的解决方案,并想发布它。

public void SaveNote(string path)
{
    if(_rtbContent.InvokeRequired)
    {
        _rtbContent.Invoke(new MethodInvoker(delegate{_rtbContent.SaveFile(path, RichTextBoxStreamType.RichText}));

        //Below is also same as above
        //_rtbContent.Invoke(new MethodInvoker(()=>_rtbContent.SaveFile(path, RichTextBoxStreamType.RichText)));
    }
    else 
    {
        _rtbContent.SaveFile(path, RichTextBoxStreamType.RichText);    
    }
}

我认为这是非常干净的解决方案。希望能帮助到你。

于 2013-04-09T07:20:16.753 回答