有一个票据承兑人类 (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' не из того потока, в котором он был создан
在这种情况下,如何正确组织对表单控件的访问?
要从另一个线程访问控件,您可以使用
Form.Invoke()- 此方法在创建表单的线程中执行指定的委托。例如,像这样: