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()
は、スクリプトを実行キャンセルすることはできません。
実行中のスクリプトを停止または一時停止できますか?
1つ以上のスクリプトがある場合、この行は 'ScriptCTS = new CancellationTokenSource();'という行で多くの問題を引き起こします。それは静的なので、起動時にこれを初期化するだけです。 'public static CancellationTokenSource ScriptCTS = new CancellationTokenSource();' –
スクリプトは何をしていますか?任意のポイントで実行を取り消すことはできません。トークンをキャンセルしても目的の処理が行われない場合は、取り消しができない時点になります。取り消しは共用的であることを忘れないでください。これは終わりの信号であり、無礼な殺害ではありません。 – Luaan
@ m.rogalskiはい、そうすべきです。スクリプトは何度も実行される可能性があるので、静的修飾子を削除することを検討しています。それは私用のCancellationTokenSource ScriptCTSです。 –