Разве плохо обновлять pictureBox из фонового потока C #? - PullRequest
2 голосов
/ 30 июня 2011

Прежде всего, приведенный ниже код работает. Он извлекает изображения в формате JPEG из непрерывного байтового потока и отображает их в pictureBox по мере их поступления, если контрольная сумма инкапсулирующего пакета верна. Беспокойство вызывает периодически возникающие проблемы с графическим интерфейсом, так как 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));
    }
}

Ответы [ 3 ]

4 голосов
/ 30 июня 2011

Я думаю, что весь доступ к элементам управления пользовательского интерфейса должен быть сделан из потока пользовательского интерфейса. Изменение элемента управления из потока, которому не принадлежит базовый дескриптор, может иметь нежелательные последствия. В лучшем случае будет сгенерировано исключение, в худшем случае все может показаться правильным, пока не произойдет какое-либо состояние гонки (и вы можете потратить много времени, пытаясь его воспроизвести).

Используйте Invoke метод, передавая ваш делегат, который будет выполнен в потоке пользовательского интерфейса.

3 голосов
/ 30 июня 2011

Почему вы не используете Invoke для обновления PictureBox?

2 голосов
/ 30 июня 2011

Вы уверены, что вообще работает?Я не понимаю, почему он не вызовет InvalidOperationException: (Cross-thread operation not valid), поскольку элемент управления обновляется из потока, отличного от того, в котором он был создан.Вы должны обновить пользовательский интерфейс с помощью метода делегата, который вызывается в потоке пользовательского интерфейса.

...