C# C计时器线程崩溃,开始唤醒

C# C计时器线程崩溃,开始唤醒,c#,wpf,window,opacity,C#,Wpf,Window,Opacity,我有一个animateMyWindow类,可以使用计时器更改打开窗口的不透明度 namespace POCentury { class animateMyWindow { Timer _timer1 = new Timer(); Window _openedWindow = null; public void animationTimerStart(object openedWindow) {

我有一个animateMyWindow类,可以使用计时器更改打开窗口的不透明度

    namespace POCentury
{
    class animateMyWindow
    {
        Timer _timer1 = new Timer();
        Window _openedWindow = null;
        public void animationTimerStart(object openedWindow)
        {
            if (openedWindow == null)
            {
                throw new Exception("Hata");
            }
            else
            {
                _openedWindow = (Window)openedWindow;
                _timer1.Interval = 1 * 25;
                _timer1.Elapsed +=  new ElapsedEventHandler(animationStart);
                _timer1.AutoReset = true;
                _timer1.Enabled = true;
                _timer1.Start();
            }
        }
        private void animationStart(object sender, ElapsedEventArgs e)
        {
            if (_openedWindow.Opacity == 1)
                animationStop();
            else
                _openedWindow.Opacity += .1;
        }
        private void animationStop()
        {
            _timer1.Stop();
        }
    }
}
animationStart函数无法到达我的窗口,因为它正在另一个线程上工作。 我试过Dispatcher.BeginInvoke,但无法使其工作。
你能帮我吗?

基本上,你不能访问animationStart事件中的openedWindow,因为它发生在不同的线程中。你需要调度员来做这件事

Dispatcher.BeginInvoke(new Action(() =>
{
        if (_openedWindow.Opacity == 1)
                animationStop();
            else
                _openedWindow.Opacity += .1;
}));

如果这是WPF,您应该检查WPF中是否有一些很好的动画工具。如果您要使用。更简单的方法是完全删除计时器内容,并通过一个。谢谢@Clemens,它现在与Dispatcher一起工作。Dispatcher.BeginInvoke不工作。它给出错误1非静态字段、方法或属性需要对象引用..请尝试Dispatcher.CurrentDispatcher.BeginInvoke…我可以回答这个问题,但您几乎提供了完整的解决方案。如果将Dispatcher.BeginInvoke替换为_openedWindow.Dispatcher.BeginInvoke,则将调用正确的调度器。他在类调度程序和窗口属性之间存在问题Dispatcher@Magnus格林达尔·巴肯:如果他在另一条线上,这会出错。