AndreaDO

导航

C#中其他线程获取UI信息

C#中其他线程获取UI信息

使用委托方式

在除了主线程的时候获取UI的内容,有时候会出现意想不到的异常报错,为了避免这种情况,使用委托是最好的选择。
如下,例子是其他线程获取控件中的Text内容。

//  委托
       /// <summary>
       /// 获取控件Text的委托
       /// </summary>
       /// <param name="control">winform控件</param>
       /// <returns>返回控件的Text内容</returns>
       public delegate string getControlTextDelegate(Control control);

       /// <summary>
       /// 设置控件的Text内容的委托
       /// </summary>
       /// <param name="control">winform控件</param>
       /// <param name="text">控件Text的新内容</param>
       public delegate void setControlTextDelegate(Control control, string text);
//变量
  public getControlTextDelegate getCText { get; set; }  //获取控件Text
       public setControlTextDelegate setCText { get; set; }  //设置控件Text

//函数
   /// <summary>
       /// 获取winfrom中控件的Text内容
       /// </summary>
       /// <param name="control"></param>
       /// <returns></returns>
         string getText(Control control)
       {
           //判断当前线程是否是主线程 
           if (Thread.CurrentThread.ManagedThreadId != mainThreadId)
           {
               return (string)control.Invoke(new Func<Control, string>(getText), control);
           }
           else
               return control.Text;
       }

       /// <summary>
       /// 设置控件的Text内容为text参数
       /// </summary>
       /// <param name="control">目标控件</param>
       /// <param name="text">设置内容</param>
         void setText(Control control, string text)
       {
           //判断是否是主线程 
           if (Thread.CurrentThread.ManagedThreadId != mainThreadId)
           {
               control.Invoke(new Action<Control, string>(setText), control, text);
           }
           else
               control.Text = text;
       }

//省略。。。
//主函数中初始化变量
   getCText = new getControlTextDelegate(getText);
  setCText = new setControlTextDelegate(setText);

这样我们在其他线程中使用上面的委托变量就可以直接获取控件的Text内容或者设置Text内容了

posted on 2024-08-27 09:01  AndreaDO  阅读(14)  评论(0编辑  收藏  举报