从背景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。