调用线程无法访问此对象 - Timer

时间:2013-07-30 18:33:57

标签: c# wpf multithreading timer

我在一个间隔为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是不言自明的。

有什么方法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:5)

使用DispatcherTimer代替计时器。

  

集成到Dispatcher队列中的计时器   在指定的时间间隔和指定的优先级处理。

应该解决你的问题。

答案 1 :(得分:4)

这只是意味着您尝试从创建的其他线程中访问某些UI元素。要解决这个问题,您需要像这样访问它

this.Dispatcher.Invoke((Action)(() =>
    {
        //access it here
    }));

注意:如果您想检查是否可以正常访问它,可以使用this

Dispatcher.CheckAccess