从背景C#线程更新pictureBox是邪恶的吗?
首先,下面的代码似乎正在起作用。 它从连续字节流中提取jpeg图像,并在封装数据包校验和正确时将它们显示在pictureBox中。 由于PictureBox是由RxThread异步更新的,因此关注的是间歇性的GUI问题。 这里使用的方法是否正常,或者在向客户展示时可能会崩溃?
public FormMain() { InitializeComponent(); var t1 = new Thread(RxThread) { IsBackground = true }; t1.Start(); } private void RxThread() { while (true) { ... // validate incoming stream var payload = new Byte[payloadSize]; ... // copy jpeg image from stream to payload pictureBox.Image = new Bitmap(new MemoryStream(payload)); } }
我认为所有对UI控件的访问都应该从UI线程完成。 从不具有底层句柄的线程修改控件可能具有不良影响。 在最好的情况下,将抛出exception,在最坏的情况下,在某些竞争条件发生之前一切似乎都可以(并且您可能花费大量时间尝试复制它)。
使用Invoke方法,传递将在UI线程上执行的委托。
为什么不使用Invoke
更新PictureBox
?
你确定它甚至可以工作吗? 我不明白为什么它不会引发InvalidOperationException: (Cross-thread operation not valid)
因为控件正在从创建的线程以外的线程更新。 您应该通过UI线程上调用的委托方法更新UI。
上述就是C#学习教程:从背景C#线程更新pictureBox是邪恶的吗?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1251184.html