从后台C#线程更新pictureBox是邪恶的吗
本文关键字:邪恶 pictureBox 更新 后台 线程 | 更新日期: 2023-09-27 18:00:55
首先,下面的代码似乎可以工作。如果封装数据包校验和正确,它会从连续字节流中提取jpeg图像,并在图像到达时将其显示在pictureBox中。问题是间歇性GUI问题,因为pictureBox是由RxThread异步更新的。这里使用的方法可以吗?或者在向客户展示时可能会崩溃?
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线程完成。从不拥有底层句柄的线程修改控件可能会产生不良影响。在最好的情况下会抛出异常,在最坏的情况下,一切似乎都很好,直到出现某种竞争条件(你可能会花很多时间试图复制它(。
使用Invoke方法,传递将在UI线程上执行的委托。
为什么不使用Invoke
更新PictureBox
?
你确定这一切都有效吗?我不明白为什么它不会引发InvalidOperationException: (Cross-thread operation not valid)
,因为控件是从上创建的线程以外的线程更新的。你应该通过在UI线程上调用的委托方法来更新UI。