Доступ к контролу из другого потока [дубликат]

179
31 октября 2018, 00:20

На данный вопрос уже ответили:

  • Работа с контролами из фонового потока 1 ответ

Есть реализация класса купюроприемника(dll). Я читаю его статус и хочу на форме выводить его в TextBox. После чтения статуса я хочу вызвать событие в котором и записать в TextBox значение.

public event EventHandler GetStatus;

......

    public async Task StartCommunication()
    {
        await Task.Run(() => StartProccess(token), token);
    }
    private void StartProccess(CancellationToken token)
    {
        byte resultStatus;
        resultStatus = Reset();
        Task.Delay(200);
        resultStatus = SetSequrity();
        while (!token.IsCancellationRequested)
        {
            resultStatus = StatusRequest();
            OnGetStatus(new BillEventArgs(resultStatus));
            Task.Delay(200);
        }
    }

....

protected void OnGetStatus(BillEventArgs e)
        {
            GetStatus?.Invoke(this, e);
        }

На форме делаю так

private async void button11_Click(object sender, EventArgs e)
        {
            bill.GetStatus += Bill_GetStatus;
            await bill.StartCommunication();
        }
        private void Bill_GetStatus(object sender, EventArgs e)
        {
            var eventArg = e as BillEventArgs;
            textBox3.Text = eventArg.Status.ToString();
        }

но при возникновении события вылетает ошибка на строке

textBox3.Text = eventArg.Status.ToString();

System.InvalidOperationException: "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'textBox3' не из того потока, в котором он был создан

Как правильно организовать доступ к контролам на форме в такой ситуации?

Answer 1

Для доступа к контролу из другого потока можно использовать Form.Invoke() - этот метод выполняет указанный делегат в том потоке, в котором была создана форма. Например, так:

private void Bill_GetStatus(object sender, EventArgs e)
{
    var eventArg = e as BillEventArgs;
    this.Invoke(new MethodInvoker(() =>
    {
        textBox3.Text = eventArg.Status.ToString();
    }));
}
READ ALSO
Альтернатива этому коду на python

Альтернатива этому коду на python

Есть такой код на c#:

228
Как открыть и отсортировать txt file c#

Как открыть и отсортировать txt file c#

Как реализовать с помощью c#, сортировкутекста из txt файла, а именно, открыть файл txt я знаю как, но как отсортировать слова, которые найду в нем,...

313
Количество входов в игру в течении недели

Количество входов в игру в течении недели

Подскажите как можно реализовать задачу:

230
Выходит из цикла for в с#

Выходит из цикла for в с#

При компиляции цикл не выполняется так как задуманоПодскажите где опечатка или недочёт

167