WinForm中的Invoke函数
文章目录
- 同步Invoke
- 函数原型
- 使用该函数
- 异步Invoke
- 函数原型(异步执行)
- 调用此函数
- 带方法Invoke
- 函数原型是
- 使用该函数
最近在处理相机串口SerialPort与Winform的窗口展示获取数据的相关内容,为了展示串口数据,必须要进行Invoke调用。
同步Invoke
函数原型
该函数的原型是:
使用该函数
针对Form中的特定组件对象,需要进行操作。
经尝试,这个可以在串口SerialPort的处理函数中调用。
当没有参数时:
public delegate void SetModeDisplay();
private void SetModle()
{
if (this.txtModelType.InvokeRequired)
{
SetModeDisplay d = new SetModeDisplay(SetModle);
this.Invoke(d, new object[] { });
}
else
{
// 需要执行的业务代码(例如)
this.txtModelType.Text = "今日宜WLB!";
this.txtModelType.BackColor = Color.DarkSeaGreen;
}
}
异步Invoke
函数原型(异步执行)
调用此函数
针对Form中的不特定组件对象,需要进行操作。
经尝试,这个不可以在串口SerialPort的处理函数中调用。
当有一些参数时:
// 创建控件的线程上执行的函数类型
public delegate void FormInvokeDelegate(object clientHandle, string value);
/// <summary>
/// 在Form的对应位置控件显示结果
/// </summary>
/// <param name="clientHandle">控件对象</param>
/// <param name="value">结果</param>
private void DisplayOnForm(object clientHandle, string value)
{
// We have to call an invoke method
if (this.InvokeRequired)
{
// Asynchronous execution of the FormInvokeDelegate delegate
this.BeginInvoke(new FormInvokeDelegate(DisplayOnForm), clientHandle, value);
return;
}
if (clientHandle.GetType() == typeof(TextBox))
{
// 需要执行的业务代码(例如)
TextBox txtMonitoredValue = (TextBox)clientHandle;
// The node succeeded - print the value as string
txtMonitoredValue.Text = value;
txtMonitoredValue.BackColor = Color.YellowGreen;
}
}
带方法Invoke
函数原型是
使用该函数
针对Form中的不特定组件对象,需要进行操作。
(但是这里做了折中,因为不能直接传引用进去,所以使用了字典来完成name到组件对象的转换。那么不做转换行么?)。
经尝试,这个可以在串口SerialPort的处理函数中调用。
当包含多个参数时:
private Dictionary<string, object> name2Obj= new Dictionary<string, object>
{
["txtACamReceive"] = txtACamReceive,
["txtACamHB"] = txtACamHB,
["txtBCamReceive"] = txtBCamReceive,
["txtBCamHB"] = txtBCamHB,
};
/// <summary>
/// 从串口收到的信息添加到文本框
/// </summary>
/// <param name="text">信息</param>
/// <param name="name">文本框名</param>
/// <param name="isAppend">添加还是覆盖?</param>
private void SetCamRecv(string text, string name, bool isAppend = false)
{
if (string.IsNullOrEmpty(text = text.Trim())) return;
if (this.InvokeRequired)
{
this.Invoke(((MethodInvoker)delegate {SetCamRecv(text, name, isAppend); }));
}
else
{
// 需要执行的业务代码(例如)
if (isAppend)
((RichTextBox)name2Obj[name]).Text = $"[{DateTime.Now:MM-dd HH:mm:ss}]{text}\n{((RichTextBox)name2Obj[name]).Text}";
else
((TextBox)name2Obj[name]).Text = text;
}
}