如何使用 CSharpCodeProvider 终止动态执行的代码?
How to terminate a dynamic executed code using CSharpCodeProvider?
我正在开发一个网站,让用户输入他们的代码并 运行 显示输出(就像 Linqpad 一样)。我使用 CSharpCodeProvider
但我也想为代码设置超时,这样如果他们的代码太慢或有无限循环它就不会破坏系统。因为代码是用户动态的,我该如何实现呢?我试过 CancellationToken
但看起来需要从动态源代码内部而不是外部调用它。
我想出来了,我忘了检查IsCancellationRequested
,下面是工作代码:
var cts = new CancellationTokenSource();
var newTask = Task.Factory.StartNew(state =>
{
var token = (CancellationToken)state;
if (!token.IsCancellationRequested)
{
var invokeInput = new object[] { input };
var output = mi.Invoke(o, invokeInput);
}
}, cts.Token, cts.Token);
if (!newTask.Wait(timeout, cts.Token))
{
cts.Cancel();
throw new Exception("The operation has timed out.");
}
我正在开发一个网站,让用户输入他们的代码并 运行 显示输出(就像 Linqpad 一样)。我使用 CSharpCodeProvider
但我也想为代码设置超时,这样如果他们的代码太慢或有无限循环它就不会破坏系统。因为代码是用户动态的,我该如何实现呢?我试过 CancellationToken
但看起来需要从动态源代码内部而不是外部调用它。
我想出来了,我忘了检查IsCancellationRequested
,下面是工作代码:
var cts = new CancellationTokenSource();
var newTask = Task.Factory.StartNew(state =>
{
var token = (CancellationToken)state;
if (!token.IsCancellationRequested)
{
var invokeInput = new object[] { input };
var output = mi.Invoke(o, invokeInput);
}
}, cts.Token, cts.Token);
if (!newTask.Wait(timeout, cts.Token))
{
cts.Cancel();
throw new Exception("The operation has timed out.");
}