F#threads对象处理异常

时间:2014-01-29 19:43:26

标签: 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 个答案:

答案 0 :(得分:1)

你可能在另一个线程中处理gamePanel,所以这个无限循环停止工作。你需要提供一种方法来向这个循环发信号通知它也应该退出。

我认为Panel没有IsDisposed方法,所以你应该将Panel包装在你自己的某种游戏状态对象中,你可以跟踪游戏结束了。执行此操作的一种好方法是在对象中存储Panel option类型:如果值为None,则游戏结束,如果为Some panel,则面板仍然有效并且可以使用。