C#与屏幕更新同步

时间:2011-02-09 11:37:30

标签: c# winforms view synchronisation

我有以下问题: 我的应用程序进行了屏幕更新,之后应该制作新视图的屏幕截图 代码如下:

    public ViewModelBase Screen {
        get {
            if (_screen == null) {
                Screen = new DataSourceChooserScreenViewModel(this);
                History.ChangeHistory(ADD_ITEM);
            }
            return _screen;
        }
        set {
            _screen = value;
            OnPropertyChanged("Screen");

            System.Windows.Forms.Application.DoEvents();
        }
    }

屏幕更新在“OnPropertyChanged(”Screen“)中完成”,屏幕截图在“History.ChangeHistory(ADD_ITEM)”中进行。
调用“Screen”的setter的方法遵循所有相同的方案:

//Do something
Screen = otherScreen;
History.ChangeHistory(ADD_ITEM);
//Do something else

这就是问题所在: 屏幕截图是在屏幕更新之前制作的,尽管执行顺序说明了其他内容。

为了解决这个问题,我尝试了几件事: 忙着等待ADD_ITEM
在ADD_ITEM中按计时器等待 使用异步线程并通过BeginInvoke()和EndInvoke()等待PropertyChangedEvent System.Windows.Forms.Application.DoEvents()

的用法

所有尝试都有相同的结果:屏幕截图在屏幕更新之前完成。在尝试使用我想出的计时器时,屏幕在执行ADD_ITEM后更新。所以我建议编译器进行一些隐式线程,我不知道如何修复/阻止它。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

当我必须做类似的事情时,我总是使用计时器事件,在处理完所有事件后触发。这将是一次性计时器事件,使用将是这样的:

解雇它:

Timer t=new Timer();
t.Tick+=DoAfter;
t.Interval=100;
t.Start();

需要做的是:

void DoAfter(object Sender, SomeArgs a)
{
    Timer t=(Timer)Sender;
    t.Stop();
    t.Dispose();
    //  perform your stuff here
    DoStuff();
}

这样你就很有可能消息循环将完成所有事情,屏幕更新将在计时器触发之前完成。