2014-02-23 35 views
1

在下面的代码是一个后台工作线程中运行:多调用/ 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有同样的“问题”

+1

backgroundworker包含更新程序的功能 –

+0

我已经用它作为reportProgress的替代方法并在userState参数中传递数据但是我仍然困惑为什么上述不起作用 – james

+0

当你说*“不起作用“*你的意思是调用调用实际上是错过了或者UI缺少更新?你确定更新没有发生得太快,你没有注意到它们吗? – James

回答

1

Invoke来我似乎是一个红色的鲱鱼。事实上,循环似乎“停止”,但当你睡觉时线程会起作用,这表明你有一个竞争条件。

我的建议是将您的环路剥离回最底层&重建它,直到您再次遇到问题 - 这应该可以帮助您确定问题所在。

相关问题