文章内容声明:
方法的使用是通过网络查询到的,但应用的代码是我自己编写的,所以就定义为“翻译”类型的文章吧。
在此,谢谢网络上提供此方法的朋友。谢谢!
代码使用背景:
在子线程访问主线程的控件值时,会出现未知的异常问题,有时可以读取成功,有时不行,所以就通过委托的方式来实现安全、稳定的读取
在子线程内想修改主线程的控件值时,是会直接抛出系统异常的,所以需要通过委托来实现。
具体实现请参见以下代码。
public delegate void SetTextCallBack(string text); //在子线程内 修改 主线程控件的值
public delegate string GetValueForChannelNoCallBack(); //在子线程内 获取 主线程控件的值
//获取标签的值 ,此方法可以在任何情况下调用,方法内部会自动判断 是否需要 启用委托来完成 读取
private string GetTestTimesValue()
{
try
{
if (this.lblTestTimes.InvokeRequired)
{
GetValueForChannelNoCallBack stcb = new GetValueForChannelNoCallBack(GetTestTimesValue);
IAsyncResult ia = lblTestTimes.BeginInvoke(stcb);
return (string)lblTestTimes.EndInvoke(ia); //这里需要利用EndInvoke来获取返回值
}
else
{
return lblTestTimes.Text;
}
}
catch (Exception Ex) { return ""; }
}
//添加ListBox的项目值 ,此方法可以在任何情况下调用,方法内部会自动判断 是否需要 启用委托来完成 写入数据
private void AddListItem(string sAddText)
{
try
{
if (this.listBoxState.InvokeRequired)
{
SetTextCallBack stcb = new SetTextCallBack(AddListItem);
this.Invoke(stcb, new object[] { sAddText });
}
else
{
listBoxState.Items.Add(sAddText + ",时间:" + System.DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss"));
listBoxState.SelectedIndex = listBoxState.Items.Count - 1;
}
}
catch (Exception Ex) { }
}
//修改Label的值 ,此方法可以在任何情况下调用,方法内部会自动判断 是否需要 启用委托来完成 修改值
private void ChangeTestResultValue(string sText)
{
try
{
if (this.lblTestResultValue.InvokeRequired)
{
SetTextCallBack stcb = new SetTextCallBack(ChangeTestResultValue);
this.Invoke(stcb, new object[] { sText });
}
else
{
lblTestResultValue.Text = sText;
}
}
catch (Exception Ex) { }
}