2014-01-29 81 views
0

嗨,我有問題如何在f#遊戲循環中繪製面板# 我收到所有時間異常,當我關閉應用程序。F#線程對象處置異常

let rec gameLoop (gamePanel:Panel) = async { 
     lock gamePanel (fun() -> 
      let graphics = gamePanel.CreateGraphics(); //<-exception 
      let rectangle = new System.Drawing.Rectangle(100, 100, 200, 200); 
      graphics.DrawEllipse(System.Drawing.Pens.Black, rectangle); 
     ) 
     return! gameLoop (gamePanel:Panel) 
     } 

    let startGame (p:Panel) (p1:Panel) = hide p; Async.StartAsTask(gameLoop p1);() 

回答

1

您可能在另一個線程中處理了gamePanel,所以這個無限循環停止工作。你需要提供一個方法來通知這個循環它也應該退出。

我不認爲Panel有一個IsDisposed方法,所以你應該把Panel包括在你自己的某種遊戲狀態對象中,以便跟蹤遊戲是否結束。這樣做的一個好方法是在對象中存儲一個Panel option類型:如果值爲None那麼遊戲已經結束,如果是Some panel那麼面板仍然有效且可以使用。

+2

可以考慮將CancellationToken傳遞給Async.StartAsTask並使用該令牌來停止遊戲循環;另請參閱CancellationTokenSource。 '靜態成員StartAsTask:Async <'T> *?TaskCreationOptions *?CancellationToken - >任務<'T>' –

+0

ok thx。我將關閉遊戲循環。 – Luffy