我正在使用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)
编译错误。
我不太习惯使用这些线程,但最近开始研究它们。任何人都可以帮我解决这个问题吗?
答案 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);
}
}
我认为这是一个很干净的解决方案。希望它有所帮助。