2017-01-04 4 views
0

Ich verwende Roslyn die Skript-API in meiner Anwendung, Code-Schnipsel, wie folgend:Wie kann "CSharpScript" angehalten oder gestoppt werden?

public class ScriptEngine 
{ 
    public static string CodeText; 
    public static event Action<string[]> CompileErrorEvent; 

    public static async Task<bool> RunScriptAsync(CancellationToken ct) 
    { 
     try 
     { 
      var scriptResult = await CSharpScript.RunAsync(CodeText, null, new ScriptHost(), null, ct); 
      return true; 
     } 
     catch (Microsoft.CodeAnalysis.Scripting.CompilationErrorException ex) 
     { 
      List<string> result = new List<string>(); 

      foreach (var item in ex.Diagnostics) 
      { 
       result.Add(item.ToString()); 
      } 

      if (result.Count > 0) 
      { 
       CompileErrorEvent?.Invoke(result.ToArray()); 
      } 

      return false; 
     } 
     catch (Exception ex) 
     { 
      IMCP_Base.Dialog.Show.SimpleError("脚本运行", ex.Message, "修改脚本"); 
      return false; 
     } 
    } 
    ....... 
} 

public static CancellationTokenSource ScriptCTS; 

private async void btnScriptRun_ItemClick(object sender, ItemClickEventArgs e) 
{ 
    ScriptCTS = new CancellationTokenSource(); 

    if (CheckScriptEditorIsNotNull()) 
    { 
     Script.ScriptEngine.CodeText = ScriptEditor.GetCode(); 
     bool runSuccess = await Script.ScriptEngine.RunScriptAsync(ScriptCTS.Token); 
    } 
} 

private void btnScriptStop_ItemClick(object sender, ItemClickEventArgs e) 
{ 
    ScriptCTS?.Cancel(); 
} 

CSharpScript.RunAsync Verfahren läuft gut, aber wenn ich ScriptStop Schaltfläche klicken, ScriptCTS?.Cancel() können laufende Skript nicht abbrechen.

Wie kann ich ein Skript anhalten oder pausieren?

+0

Wenn Sie mehr als 1 Skript haben, dann wird diese Zeile 'ScriptCTS = new CancellationTokenSource();' eine Menge Probleme machen. Da es statisch ist, können Sie dies nur beim Start 'public static initialisieren. CancellationTokenSource ScriptCTS = new CancellationTokenSource();' –

+1

Was macht das Skript? Sie können die Ausführung nicht an beliebigen Stellen abbrechen. Wenn das Abbrechen des Tokens nicht Ihren Vorstellungen entspricht, sind Sie an einem Punkt, an dem eine Stornierung nicht möglich ist. Vergiss nicht, dass die Kündigung koöperativ ist - es ist nur ein Beendigungssignal, kein unhöflicher Tötungsversuch. – Luaan

+0

@ m.rogalski ja, sollte es sein. Da das Skript möglicherweise mehrmals ausgeführt wird, erwäge ich, statische Modifikatoren zu entfernen. Es wäre privat CancellationTokenSource ScriptCTS; –

Antwort

0

Wenn Sie in Ihren Skripts Löschpunkte haben möchten, können Sie globals verwenden und die CancelationToken übergeben, die Sie dann in Ihren Skripten für die Stornierung einchecken können.

+0

Es scheint, dass es nur sein kann –

Verwandte Themen