2014-01-29 36 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