中止 roslyn 脚本执行

Abort roslyn script execution

我想为通过 Roslyn 执行的脚本实现超时机制,因此我需要一种中止脚本执行的方法。到目前为止我找到的唯一解决方案是在线程内执行脚本并终止它,但这显然是一个有缺陷的解决方案。

有更好的方法吗?

除了你启动一个单独的进程并杀死它(以避免 Thread.Abort() 的标准陷阱)之外,这是你能做的最好的事情。考虑到脚本代码可能或多或少是任意的,真的没有更好的选择了。只需要您的脚本即可完成 Thread.Sleep(Timeout.Infinite),而脚本引擎无法恢复它。

首先创建一个新线程并将您的代码作为动作放入线程中。然后调用Thread.Start方法开始执行。使用Thread.Join方法等待线程完成执行。

在下面的代码中,如果线程执行没有在 6 秒内完成则线程被中断。

代码如下:

Thread thread = new Thread(() => {
    try
    {
          // your code related to Roslyn is here
          // ...
    }
    catch (Exception ex)
    {
    }

});

thread.Start();

if (!thread.Join(TimeSpan.FromSeconds(6)))
{
    thread.Interrupt();
}

以上代码在6秒后结束编译