如何使用CSharpCodeProvider终止动态执行的代码?

时间:2017-03-10 09:24:21

标签: c# dynamic timeout execute csharpcodeprovider

我正在开发一个网站,让用户输入他们的代码并运行以显示输出(就像Linqpad一样)。我使用CSharpCodeProvider但我也想为代码设置超时,这样如果代码太慢或无限循环,它就不会破坏系统。因为代码是用户动态的,我怎么能实现呢?我试过CancellationToken,但看起来需要从动态源代码内部调用,而不是在外部调用。

1 个答案:

答案 0 :(得分:0)

我弄清楚了,我忘了检查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.");
}