中止 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秒后结束编译
我想为通过 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秒后结束编译