【发布时间】:2011-12-18 20:41:03
【问题描述】:
我是 C# 线程的新手,尽管阅读了很多关于线程的理论,但它在实践中对我没有多大帮助。
我想为跳棋游戏编写 AI 函数(minmax alphabeta)并在不同的线程中执行。
有 4 个选项:常规 Tread、线程池、异步委托、BackgroundWorker。
BackgroundWorker 对我来说似乎很理想,它具有完成委托,因此我可以运行“makemove”函数,该函数实际上会在棋盘上进行计算的移动并更新进度条。
我对此有 3 个问题:
BackgroundWorker 真的是这个案例的最佳解决方案吗?
BackgroundWorker 在线程池中执行,这样做有什么好处?当你有许多不同的线程时,总是说线程池很好,而我的情况并非如此。
我看到的所有代码示例都太简单了,只展示了如何创建一个这样的线程。在我的程序中,每次轮到计算机时我都需要运行这个函数,所以我可能需要杀死前一个线程并启动一个新线程。实现这一切的正确方法是什么?
任何帮助将不胜感激。
【问题讨论】:
-
你能解释一下为什么你想让 AI 在自己的线程中运行吗?为什么不在 UI 线程上运行 AI?
-
因为那样表格会冻结。
-
仅当 AI 长时间运行时。为什么不构建您的 AI,使其运行时间少于 10 毫秒,记住它在哪里,允许表单处理事件,然后再运行 10 毫秒,重复?不需要额外的线程。十毫秒大约是四千万个处理器周期;当然,您可以在 4000 万个周期内完成相当多的工作。
-
从来没想过。假设我必须在 10 种不同的移动中进行选择,所以我会分别计算每一种移动并将其排名放入某个数据结构中。但是如果计算一些移动等级需要超过十毫秒呢?听起来很复杂。你有某个项目的链接,我可以从中学习这项技术吗?
-
是的,这很复杂;但多线程也是如此。使用多线程,您必须担心两个线程同时读取和写入相同的数据结构,您必须担心死锁和活锁以及所有这些痛苦的事情。无法避免同时做两件事很复杂的事实。
标签: c# multithreading artificial-intelligence backgroundworker threadpool