使用Invoke从Richtextbox保存文件

时间:2013-04-08 07:32:16

标签: c# richtextbox backgroundworker invoke

我正在使用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)编译错误。

我不太习惯使用这些线程,但最近开始研究它们。任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分: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);    
    }
}

答案 1 :(得分: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);    
    }
}

我认为这是一个很干净的解决方案。希望它有所帮助。