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

时间:2014-02-23 00:36:02

标签: c# multithreading

以下代码在后台工作线程中运行:

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),否则不会进行所有的Invoke调用。调用整个循环,但只有20%的调用调用(在停止时获得20%,而不是间歇性结果)

如果我在调试中单步执行它也可以正常工作。

想想也许问题是当Background Worker线程完成时它取消了从它做的任何Invokes。但是放一个Thread.Sleep(10000)来挂起后台线程更长时间没有做任何事情。

调用电话的速度是否有限制?

同样BeginInvoke也有相同的“问题”

1 个答案:

答案 0 :(得分:1)

调用我似乎是一个红鲱鱼。循环似乎“停止”但在你睡觉时工作的事实会告诉我你有竞争条件。

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