为了账号安全,请及时绑定邮箱和手机立即绑定

c#wpf-多线程

c#wpf-多线程

C#
白衣非少年 2021-05-04 13:16:02
我正在使用 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。我不知道为什么会这样。我将不胜感激任何帮助
查看完整描述

2 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

您是正确的,它是在不同的线程上执行的。

您可以使用调用NextState()主线程上的方法Dispatcher

Dispatcher.Invoke(() = > NextState());


查看完整回答
反对 回复 2021-05-29
  • 2 回答
  • 0 关注
  • 157 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信