我有一个用户控件,它以拨号格式(图像)显示速度。
它只有一个方法: SetSpeed(int speed);
然后,它使拨盘从上一设置的速度移动到所需的速度。然后,它在插入中做到了。也就是说,它移动到新的速度。
问题是,如果赛车以10公里/小时的速度行驶,然后(非常快地)达到100公里/小时,转盘可能需要2秒才能达到这个速度……(它不是100%实时的-这是现实的。它移动到新的速度)。
但是,如果在刻度盘达到100 if /h之前,人的速度降到了50 if/h,我需要将运动中断到100,然后开始移动到50。不管拨盘的当前位置(不是速度)如何,我都需要更改“目标速度”。
我的控件使用BackgroundWorker来处理刷新,而不是锁定UI。
所以,我的调用是非常基本的UI:
dial1.SetSpeed(int.Parse(value));然后,用户控件执行以下操作:
BackgroundWorker bw = new BackgroundWorker();
public void SetSpeed(int speed)
{
while(bw.IsBusy)
{
Thread.Sleep(50);
}
bw.RunWorkerAsync(speed);
}以及完成这项工作的方法:
private void UpdateSpeed(object sender, DoWorkEventArgs e)
{
var oldSpeed = airSpeed;
var newSpeed = (int) e.Argument;
if(oldSpeed <= newSpeed)
{
for (int i = oldSpeed; i < newSpeed; i++)
{
airSpeed++;
this.Invoke(new MethodInvoker(Refresh));
}
}
else
{
for (int i = oldSpeed; i > newSpeed; i--)
{
airSpeed--;
this.Invoke(new MethodInvoker(Refresh));
}
}
airSpeed = newSpeed;
}当我快速连续地向它发送两个值时,它会锁定...如果线程正在运行,我如何中断它,并改变它的值?
(此外,我认为我更改速度的代码很糟糕-可以更整洁吗?)
发布于 2013-01-07 16:04:01
你不需要。您以适当的方式处理它,使用锁,并检查值是否需要更改。你不能打断它。
基本上,您需要在SetSpeed和Refresh方法之间设置一个锁定区,以便其中一个阻塞另一个。然后,当您设置速度并且线程当前处于临界区时,它将简单地等待,直到更新完成。
你的UpdateSpeed没有任何意义--改变(airspeed--和airspeed++)应该是由计时器驱动的……您当前可以根据处理器速度以“任意”速度更改它们。没有时间。
https://stackoverflow.com/questions/14191953
复制相似问题