今天在写应用软件的时候用到一个天气的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