线程间操作无效: 从不是创建控件的线程访问它 解决办法
2010-03-03 09:42
411 查看
今天在写应用软件的时候用到一个天气的web服务,在软件刚启动的时候就要访问,这样影响了软件启动速度,然后用了一个线程去处理访问web服务,把访问到的信息写到相应的控件。然后就出现问题了。线程间操作无效。原因是多个线程同时操作一个控件造成的。
解决办法是用一个委托,如下:
#region 用于天气的委托
delegate void SetPicboxValue();//括号里边可以写相应的参数
#endregion
#region 天气线程
System.Threading.Thread td = new Thread(new ThreadStart(ShowWeather));
td.Start();
#endregion
#region 天气信息
private void ShowWeather()
{
try
{
if (strList == null)
{
using (WeatherServer.WeatherWebService ws = new HySoft.OfficeManagement.WeatherServer.WeatherWebService())
{
if (ws != null)
{
strList = ws.getWeatherbyCityName("57083");
}
}
}
this.SetValue();
}
catch(Exception ex)
{
this.SetValue();
}
}
private void SetValue()
{
if (pic_titleweather.InvokeRequired && label_titleweather.InvokeRequired)
{
SetPicboxValue setPic = new SetPicboxValue(SetValue);
this.Invoke(setPic);//还有一个参数是数组对象,对应的就是SetValue()的参数,如果没有参数,则不用
}
else
{
if (strList != null && strList[1].ToString() != "")
{
pic_titleweather.Image = imgWeatherList.Images["b_" + strList[8].ToString()];
pic_titleweather.Update();
}
else
{
label_titleweather.Text = "暂无服务";
pic_titleweather.Enabled = label_titleweather.Enabled = false;
}
}
}
#endregion
解决办法是用一个委托,如下:
#region 用于天气的委托
delegate void SetPicboxValue();//括号里边可以写相应的参数
#endregion
#region 天气线程
System.Threading.Thread td = new Thread(new ThreadStart(ShowWeather));
td.Start();
#endregion
#region 天气信息
private void ShowWeather()
{
try
{
if (strList == null)
{
using (WeatherServer.WeatherWebService ws = new HySoft.OfficeManagement.WeatherServer.WeatherWebService())
{
if (ws != null)
{
strList = ws.getWeatherbyCityName("57083");
}
}
}
this.SetValue();
}
catch(Exception ex)
{
this.SetValue();
}
}
private void SetValue()
{
if (pic_titleweather.InvokeRequired && label_titleweather.InvokeRequired)
{
SetPicboxValue setPic = new SetPicboxValue(SetValue);
this.Invoke(setPic);//还有一个参数是数组对象,对应的就是SetValue()的参数,如果没有参数,则不用
}
else
{
if (strList != null && strList[1].ToString() != "")
{
pic_titleweather.Image = imgWeatherList.Images["b_" + strList[8].ToString()];
pic_titleweather.Update();
}
else
{
label_titleweather.Text = "暂无服务";
pic_titleweather.Enabled = label_titleweather.Enabled = false;
}
}
}
#endregion
相关文章推荐
- 其他信息: 线程间操作无效: 从不是创建控件“stateLabel”的线程访问它。解决办法
- 【转】线程间操作无效:从不是创建控件 的线程访问它,解决办法
- wusir 线程间操作无效: 从不是创建控件“”的线程访问它 解决办法
- c# 线程间操作无效: 从不是创建控件“textBox1”的线程访问它。解决方法
- 教你如何解决“线程间操作无效: 从不是创建控件的线程访问它” 转
- 小结“线程间操作无效: 从不是创建控件的线程访问它” 错误的解决方法
- 【转】线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法
- BackGroundWorker解决“线程间操作无效: 从不是创建控件的线程访问它” (C# VS2008)
- 解决"线程间操作无效: 从不是创建控件的线程访问它"
- 线程间操作无效: 从不是创建控件“...”的线程访问它(解决方法)
- 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~
- 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~
- 线程间操作无效: 从不是创建控件“”的线程访问它的解决方法~
- “线程间操作无效:从不是创建控件“XX”的线程访问它”的解决方法
- c# 线程间操作无效: 从不是创建控件“”的线程访问它,用托管来解决
- c#中使用多线程访问winform中控件的若干问题 解决线程间操作无效: 从不是创建控件的线程访问它
- 如何解决“线程间操作无效: 从不是创建控件的线程访问它”
- [转]线程间操作无效: 从不是创建控件...的解决办法
- 小结“线程间操作无效: 从不是创建控件的线程访问它” 错误的解决方法
- C# 线程间操作无效: 从不是创建控件...的解决办法