使用Invoke从Richtextbox中保存文件

本文关键字:保存文件 Richtextbox Invoke 使用 | 更新日期: 2023-09-27 18:08:12

我有一个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)));

我在_rtbContent.SaveFile(path, RichTextBoxStreamType.RichText)上得到Method name expected编译错误。

我不太习惯使用这些线程,但最近已经开始使用它们了。有人能在这个问题上帮助我吗?

使用Invoke从Richtextbox中保存文件

使用回调:

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);    
    }
}

我得到了另一个有趣的解决方案,我想把它贴出来。

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);    
    }
}

我认为这是一个非常干净的解决方案。