c# 子线程内访问、修改主线程的控件值



文章内容声明:

               方法的使用是通过网络查询到的,但应用的代码是我自己编写的,所以就定义为“翻译”类型的文章吧。

               在此,谢谢网络上提供此方法的朋友。谢谢!


     代码使用背景:

              在子线程访问主线程的控件值时,会出现未知的异常问题,有时可以读取成功,有时不行,所以就通过委托的方式来实现安全、稳定的读取


            在子线程内想修改主线程的控件值时,是会直接抛出系统异常的,所以需要通过委托来实现。


      具体实现请参见以下代码。

 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) { }

        }

猜你喜欢

转载自blog.csdn.net/uiwgi/article/details/65437357