2017-03-10 4 views
0

Je développe un site qui laisse le type d'utilisateur dans leur code et montrent leur sortie (comme LINQPad). Je CSharpCodeProvider mais je veux aussi définir le délai pour le code, afin qu'il ne se cassera pas système si leur code est trop lent ou avoir boucle infinie. Parce que le code est dynamique de l'utilisateur, comment puis-je y parvenir? J'ai essayé CancellationToken mais semble avoir besoin d'être appelé à partir du code source dynamique, pas à l'extérieur.Comment terminer un code exécuté dynamique en utilisant CSharpCodeProvider?

+0

voulez-vous dire annuler la course ou la compilation? –

+0

@LeiYang signifie annuler la Process.Kill vous mettez –

+0

Qu'en est-'Process.Kill' ​​ –

Répondre

0

I figured it out, j'ai oublié de vérifier IsCancellationRequested, ci-dessous est le code de travail:

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