2017-03-10 62 views
0

我正在開發一個網站,讓用戶鍵入他們的代碼並運行顯示輸出(就像Linqpad)。我使用了CSharpCodeProvider,但我也想爲代碼設置超時時間,以便在代碼太慢或無限循環時不會中斷系統。由於代碼是來自用戶的動態代碼,我該如何實現?我試過CancellationToken,但看起來像需要從動態源代碼中調用,而不是在外面。如何使用CSharpCodeProvider終止動態執行的代碼?

+0

你的意思是取消運行或編譯? –

+0

@LeiYang表示取消正在運行的動態編譯代碼 –

+0

那麼'Process.Kill'​​ –

回答

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."); 
}