Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我的用户控件的线程_C#_Multithreading_Backgroundworker - Fatal编程技术网

C# 我的用户控件的线程

C# 我的用户控件的线程,c#,multithreading,backgroundworker,C#,Multithreading,Backgroundworker,我有一个用户控件,它以拨号格式(图像)显示速度 它有一个单一的方法:设置速度(int-speed) 然后,它使刻度盘从上次设定的速度移动到所需的速度。这在犯罪案件中也是如此。也就是说,它以新的速度移动 问题是,如果汽车行驶速度为10公里/小时,然后(非常快地)行驶到100公里/小时,则拨号盘可能需要2秒钟才能达到该速度。。。(它不是100%实时的-这是现实的..它会以新的速度移动) 但是,如果在刻度盘到达100公里/小时之前,人的速度减慢到50公里/小时,我需要中断移动到100,然后开始移动到5

我有一个用户控件,它以拨号格式(图像)显示速度

它有一个单一的方法:设置速度(int-speed)

然后,它使刻度盘从上次设定的速度移动到所需的速度。这在犯罪案件中也是如此。也就是说,它以新的速度移动

问题是,如果汽车行驶速度为10公里/小时,然后(非常快地)行驶到100公里/小时,则拨号盘可能需要2秒钟才能达到该速度。。。(它不是100%实时的-这是现实的..它会以新的速度移动)

但是,如果在刻度盘到达100公里/小时之前,人的速度减慢到50公里/小时,我需要中断移动到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;
        }
private void UpdateSpeed(对象发送方,DoWorkEventArgs e)
{
var oldSpeed=空速;
var newSpeed=(int)e.参数;
if(oldSpeed newSpeed;i--)
{
空速--;
this.Invoke(newmethodinvoker(Refresh));
}
}
空速=新速度;
}
当我快速连续发送两个值时,它会锁定。。。 如果线程正在运行,如何中断线程并更改其值


(另外,我认为我更改速度的代码不好-可以使其更整洁吗?

您没有。以正确的方式处理它,使用锁,并检查值是否需要更改。你不要打断它

基本上,在SetSpeed和Refresh方法之间需要一个锁定区域,以便一个方法阻止另一个方法。然后,当您设置速度并且线程当前处于关键区域时,它只需等待更新完成


而你的UpdateSpeed毫无意义——改变(空速——和空速++)应该是定时器驱动的。。。您当前以“任意”速度更改它们,具体取决于处理器速度。没有时间。

谢谢。只是为了确保我能达到同样的目标。。。如果所需的指示速度发生变化,当螺纹将指示器移动到先前所需的指示速度时,指示器不应达到旧的所需速度。。。它应该开始移动到新的期望速度。也就是说,不要先使用旧的速度,然后再使用新的速度。@Craig在你的
BackgroundWorker
上使用取消。最重要的是,更改你的算法。现在我这么做是因为你这样编码。如果使用不同的代码方法,它总是指向当前目标。