0
我正在開發一個網站,讓用戶鍵入他們的代碼並運行顯示輸出(就像Linqpad)。我使用了CSharpCodeProvider
,但我也想爲代碼設置超時時間,以便在代碼太慢或無限循環時不會中斷系統。由於代碼是來自用戶的動態代碼,我該如何實現?我試過CancellationToken
,但看起來像需要從動態源代碼中調用,而不是在外面。如何使用CSharpCodeProvider終止動態執行的代碼?
我正在開發一個網站,讓用戶鍵入他們的代碼並運行顯示輸出(就像Linqpad)。我使用了CSharpCodeProvider
,但我也想爲代碼設置超時時間,以便在代碼太慢或無限循環時不會中斷系統。由於代碼是來自用戶的動態代碼,我該如何實現?我試過CancellationToken
,但看起來像需要從動態源代碼中調用,而不是在外面。如何使用CSharpCodeProvider終止動態執行的代碼?
我想通了,我忘了檢查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.");
}
你的意思是取消運行或編譯? –
@LeiYang表示取消正在運行的動態編譯代碼 –
那麼'Process.Kill' –