private Thread AnemometerConnectionWatcher;
public class UICallBackParam
{
public Label tar;public string text;
public UICallBackParam(Label ll,string ss)
{
tar = ll;
text = ss;
}
}
private void buttonAnemometer_Click(object sender, EventArgs e)//启动后台线程
{
anemometerClientConnect();
if (AnemometerConnectionWatcher != null)
{
//if (!AnemometerConnectionWatcher.Join(5000))//等待任务结束
AnemometerConnectionWatcher.Abort();
//AnemometerConnectionWatcher= null;
}
AnemometerConnectionWatcher = new Thread(AnemometerConnectionWatcherTask);
AnemometerConnectionWatcher.Start();
}
private async void AnemometerConnectionWatcherTask()
{
// This task takes care of automatically reconnecting the interface
// when the connection is drop or if an I/O error occurs
while (anemometerClient.Connected)
{
//ResultAnemometer = await UpdateVelocity();
Thread thread = new Thread(new ParameterizedThreadStart(updateUILabel));
thread.Start(new UICallBackParam(windVlabel, await UpdateVelocity()));
Thread.Sleep(2000);
}
}
delegate void UpdateUICallback(object msg);
private void updateUILabel(object msg)
{
UICallBackParam uICallBack = (UICallBackParam)msg;
Label tar = uICallBack.tar; string text = uICallBack.text;
if (tar.InvokeRequired)
{
UpdateUICallback d = new UpdateUICallback(updateUILabel);
this.Invoke(d, uICallBack);
}
else
{
tar.Text=text;
}
}
当然,如果只是当初实现刷新UI的功能,不需要带参数的多线程ParameterizedThreadStart,所以最终的代码为:
private Thread AnemometerConnectionWatcher;
private void buttonAnemometer_Click(object sender, EventArgs e)
{
anemometerClientConnect();
if (AnemometerConnectionWatcher != null)
{
AnemometerConnectionWatcher.Abort();
}
AnemometerConnectionWatcher = new Thread(AnemometerConnectionWatcherTask);
AnemometerConnectionWatcher.Start();
}
private async void AnemometerConnectionWatcherTask()
{
while (anemometerClient.Connected)
{
updateUILabel(windVlabel, await UpdateVelocity());
Thread.Sleep(1000);
}
}
delegate void UpdateUICallback(Label tar, string text);
private void updateUILabel(Label tar, string text)
{
if (tar.InvokeRequired)
{
UpdateUICallback d = new UpdateUICallback(updateUILabel);
this.Invoke(d, tar,text);
}
else
{
tar.Text = text;
}
}