2014-02-23 36 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來我似乎是一個紅色的鯡魚。事實上,循環似乎「停止」,但當你睡覺時線程會起作用,這表明你有一個競爭條件。

我的建議是將您的環路剝離回最底層&重建它,直到您再次遇到問題 - 這應該可以幫助您確定問題所在。

相關問題