c# - 我应该在自己的线程中运行每个插件吗?

标签 c# multithreading scripting threadpool

在我的游戏中,用户可以加载自定义脚本。 通常会加载 50-100 个脚本。 每个脚本通过其 Update 方法在每一帧中被调用。

  1. 当一个脚本崩溃时,其他脚本不应受到影响。
  2. 允许脚本更新方法每帧最多运行 1 毫秒。因此,我还需要能够中止卡住/未及时使用react的脚本。

我应该怎么做?我认为每秒启动 3000 - 6000 个线程并不是这里的最佳实践。 一旦在循环中调用更新并等待 16 毫秒,我也无法启动线程,因为脚本需要与游戏同步。脚本依赖于每一帧运行。

这里线程池是正确的选择吗?如果是这样,我该如何在超时时中止脚本?

最佳答案

简而言之:很难抵御恶意代码。

1。当一个脚本崩溃时,其他脚本不应受到影响:要实现此目的,Windows 中唯一可靠的方法是在单独的进程中运行每个脚本。 IE。由“脚本”引起的 StackOverflow 异常将导致您的进程中断。跨进程通信不太可能轻易满足您的性能要求。

2。每个脚本 1 毫秒:中止线程是一种解决方案。避免大量的线程(超过十个线程是有问题的:线程之间的切换会降低你的性能,堆栈空间会吃掉所有内存并且通常同步状态跨线程很有趣)。考虑不要重新启动表现不佳的“脚本”——这样您就不必担心过多的 Thread.Abort 调用。请注意,不需要杀死线程将杀死与“脚本”相关的所有内容,因为它可能已经产生了自己的线程/异步操作/线程池任务......

关于c# - 我应该在自己的线程中运行每个插件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7155481/

相关文章:

c++ - 是否可以在现代 C++ 中使用 fork?

JavaFx:为什么剂量 'Thread.sleep( )' 停止 UI 线程?

java - N个线程的多线程

powershell - 提升 Powershell 脚本

linux - 用awk实现tail

C# DWORD 和 QWORD - 有符号和无符号的疯狂

c# - 在没有云服务的情况下关闭应用程序时通知用户

php - 在通过 HTML 上传的 CSV 上运行 Python 脚本

c# - 在没有任何控制的情况下检测 winform 上的 keyup

c# - 按日期降序获取被禁用户列表