从后台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));
    }
}

从后台C#线程更新pictureBox是邪恶的吗

我认为所有对UI控件的访问都应该从UI线程完成。从不拥有底层句柄的线程修改控件可能会产生不良影响。在最好的情况下会抛出异常,在最坏的情况下,一切似乎都很好,直到出现某种竞争条件(你可能会花很多时间试图复制它(。

使用Invoke方法,传递将在UI线程上执行的委托。

为什么不使用Invoke更新PictureBox

你确定这一切都有效吗?我不明白为什么它不会引发InvalidOperationException: (Cross-thread operation not valid),因为控件是从上创建的线程以外的线程更新的。你应该通过在UI线程上调用的委托方法来更新UI。