2017-01-04 2 views
0

"CSharpScript"の実行を一時停止または停止する方法はありますか?私は次のようなコードスニペットを自分のアプリケーションでロスリンのスクリプトAPIを使用してい

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方法はうまく動作しますが、私はScriptStopボタンをクリックすると、ScriptCTS?.Cancel()は、スクリプトを実行キャンセルすることはできません。

実行中のスクリプトを停止または一時停止できますか?

+0

1つ以上のスクリプトがある場合、この行は 'ScriptCTS = new CancellationTokenSource();'という行で多くの問題を引き起こします。それは静的なので、起動時にこれを初期化するだけです。 'public static CancellationTokenSource ScriptCTS = new CancellationTokenSource();' –

+1

スクリプトは何をしていますか?任意のポイントで実行を取り消すことはできません。トークンをキャンセルしても目的の処理が行われない場合は、取り消しができない時点になります。取り消しは共用的であることを忘れないでください。これは終わりの信号であり、無礼な殺害ではありません。 – Luaan

+0

@ m.rogalskiはい、そうすべきです。スクリプトは何度も実行される可能性があるので、静的修飾子を削除することを検討しています。それは私用のCancellationTokenSource ScriptCTSです。 –

答えて

0

スクリプト内にキャンセルポイントが必要な場合は、globalsを使用してCancelationTokenを渡すことができます。この場合、スクリプトのキャンセルを確認することができます。

+0

これは –

関連する問題