-2

Timer在一个间隔为的方法中设置 a ,1000以便每秒将另一个相应的字符输入到 a 中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是不言自明的。

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

4

2 回答 2

5

使用DispatcherTimer而不是 Timer。

一个集成到 Dispatcher 队列中的计时器,它以指定的时间间隔和指定的优先级进行处理。

应该能解决你的问题。

于 2013-07-30T19:05:30.323 回答
4

这仅仅意味着您正在尝试从创建它的线程之外的线程访问某些 UI 元素。要克服这个问题,您需要像这样访问它

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

注意:如果要检查是否可以正常访问,可以使用这个

Dispatcher.CheckAccess
于 2013-07-30T18:36:08.433 回答