多个 Invoke / BeginInvoke 调用没有 Thread.Sleep() 就无法完成



在下面的代码中,在后台工作线程中运行:

while (StaticVideoList.DecodedFramesList.Count > 0)
{
    if (StaticVideoList.DecodedFramesList.ContainsKey(a))
    {
        byte[] output;
        if(StaticVideoList.DecodedFramesList.TryRemove(a, out output))
        {
            MemoryStream ms = new MemoryStream(output);
            Image img = Image.FromStream(ms);
            a++;
            this.Invoke((Action)delegate
            {
                textEdit7.Text = "Num Frame: " + a.ToString() + " / " + (1000m / ((decimal)sw.ElapsedMilliseconds / (decimal)a)).ToString();
                pictureEdit1.Image = img;
            });
            // Works if I do this.. 10 is the minium. 
            //System.Threading.Thread.Sleep(10);
        }
    }
}

我的问题是,除非我在循环中添加Thread.Sleep(10),否则不会进行所有调用调用。调用整个循环,但只进行了 20% 的调用调用(它得到 20% 然后停止,而不是间歇性结果)

如果我逐步调试,它也可以正常工作。

认为问题可能是当后台工作线程完成时,它会取消从它进行的任何调用。但是放一个 Thread.Sleep(10000) 来更长时间地挂起后台线程并没有做任何事情。

进行调用的速度是否有限制?

BeginInvoke也有相同的"问题"

向我调用似乎是一条红鲱鱼。循环似乎"停止"但在您睡眠线程时工作的事实向我表明您有竞争条件。

我的建议是将您的循环剥离到最低限度并重建它,直到您再次遇到问题 - 这应该可以帮助您确定问题所在。

最新更新