Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it evil to update a pictureBox from a background C# thread?

First of all, the code below seems to be working. It extracts jpeg images from a continuous byte stream and displays them in a pictureBox as they arrive if the encapsulating packet checksum is correct. The concern is intermittent GUI problems since the pictureBox is asynchronously updated by RxThread. Is the method used here OK or might this crash while showing it to the customer?

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));
    }
}
like image 449
jacknad Avatar asked Jan 20 '26 19:01

jacknad


1 Answers

I think all access to UI controls should be done from UI thread. Modifying control from the thread that doesn't own the underlying handle may have undesirable effects. In the best case scenario the exception will be thrown, in the worst case everything may seem to be all right until some race condition happens (and you may spend lots of time trying to replicate it).

Use Invoke method, passing your delegate that will be executed on the UI thread.

like image 179
Jakub Konecki Avatar answered Jan 23 '26 07:01

Jakub Konecki