我在一个间隔为Timer
的方法中设置1000
,这样每隔一秒它就会将另一个对应的字符键入Textbox
(几乎自动输入)。当我检查_currentTextLength == _text.Length
时,我得到了线程错误“调用线程无法访问此对象,因为另一个线程拥有它。”
public void WriteText(string Text)
{
timer = new Timer();
try
{
_text = Text;
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed_WriteText);
timer.Interval = 1000;
timer.Enabled = true;
timer.Start();
}
catch
{
MessageBox.Show("WriteText timer could not be started.");
}
}
// Write Text Timer Event
void timer_Elapsed_WriteText(object sender, ElapsedEventArgs e)
{
TextBoxAutomationPeer peer = new TextBoxAutomationPeer(_textBox);
IValueProvider valueProvider = peer.GetPattern(PatternInterface.Value) as IValueProvider;
valueProvider.SetValue(_text.Substring(0, _currentTextLength));
if (_currentTextLength == _text.Length) // Error here
{
timer.Stop();
timer = null;
return;
}
_currentTextLength++;
}
变量_text
是私有类变量,_currentTextLength
也是如此。 _textBox
是不言自明的。
有什么方法可以解决这个问题吗?
答案 0 :(得分:5)
答案 1 :(得分:4)
这只是意味着您尝试从创建的其他线程中访问某些UI元素。要解决这个问题,您需要像这样访问它
this.Dispatcher.Invoke((Action)(() =>
{
//access it here
}));
注意:如果您想检查是否可以正常访问它,可以使用this
Dispatcher.CheckAccess