c#wpf-多线程

我正在使用C#wpf并想拍摄照相机图片,然后在完成事件调用后-在MainWindow中更改一些控件。问题是事件是在与主线程不同的线程中调用的,并且要运行我的NextState函数(更改某些控件),它必须是主线程(否则我得到带有警告的消息框,什么也没有发生)。这是我的代码:

public partial class PhotoCapture : UserControl
{
    private bool ready;
    private System.Timers.Timer timer;
    private readonly Object lockObj = new Object();

    public PhotoCapture(PhotoCaptureState photoCaptureState)
    {
        InitializeComponent();

        ready = false;
        PictureManager.LoadCompleted += PictureManager_LoadCompleted;
        CameraManager.TakePicture();
        timer = new System.Timers.Timer(200);
        timer.Elapsed += new System.Timers.ElapsedEventHandler(Timer_Elapsed);
        timer.Enabled = true;
    }

    private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        bool change = false;
        lock(lockObj)
        {
            if (ready)
            {
                change = true;
            }
        }
        if (change)
        {
            MessageBox.Show("ready");
            timer.Enabled = false;
            PictureManager.LoadCompleted -= PictureManager_LoadCompleted;
            NextState();
        }
    }

    private void PictureManager_LoadCompleted()
    {
        lock (lockObj)
        {
            ready = true;
        }
    }

    private void NextState()
    {
        MainWindow wnd = (MainWindow)Application.Current.MainWindow;
        App app = (App)wnd.contentControl.Content;
        app.NextState();
    }
}

有趣的是,我得到了几个“就绪”消息框,看起来根本没有执行NextStage。我不知道为什么会这样。我将不胜感激任何帮助

苛刻

从主UI线程分离出来的后台线程无法更新在UI线程上创建的元素的内容。为了使后台线程访问UI的属性,后台线程必须将工作委派给与UI线程关联的Dispatcher。

在您的Timer_Elapsed课堂上,您需要调用调度程序来完成UI工作。你可以在Dispatcher 这里阅读

要么

或者,您可以尝试使用DispatcherTimerDispatcherTimer在UI线程上触发其Tick事件,您可以使用UI进行任何操作。您可以在此处查看示例

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章