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内容了