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。我不知道为什么会这样。我将不胜感激任何帮助


白衣非少年
浏览 163回答 2
2回答

喵喵时光机

您是正确的,它是在不同的线程上执行的。您可以使用调用NextState()主线程上的方法Dispatcher。Dispatcher.Invoke(() = > NextState());
打开App,查看更多内容
随时随地看视频慕课网APP