首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何停止使用CSScript加载的脚本?

如何停止使用CSScript加载的脚本?
EN

Stack Overflow用户
提问于 2016-07-21 23:58:17
回答 1查看 282关注 0票数 0

我使用CS-Script库在WPF应用程序中运行用户定义的脚本。如果脚本无休止地运行,我如何取消它?当我的用户编写脚本时,我不能依赖于在脚本中选中的取消标志。

以下是显示该问题的简化代码片段:

代码语言:javascript
复制
public partial class MainWindow : Window
{
    public string MessageFromScript
    {
        get { return (string)GetValue(MessageFromScriptProperty); }
        set { SetValue(MessageFromScriptProperty, value); }
    }
    public static readonly DependencyProperty MessageFromScriptProperty =
        DependencyProperty.Register("MessageFromScript", typeof(string), typeof(MainWindow), new PropertyMetadata(null));


    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;
    }

    BackgroundWorker worker = null;
    private void OnStart(object sender, RoutedEventArgs e)
    {
        if(worker != null)
        {
            return;
        }
        worker = new BackgroundWorker();
        worker.DoWork += RunScript;
        worker.RunWorkerCompleted += ScriptCompleted;
        worker.WorkerSupportsCancellation = true;
        worker.RunWorkerAsync();
    }

    private void ScriptCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if(e.Cancelled)
            MessageFromScript = "Script cancelled";
        else
            MessageFromScript = e.Result.ToString();
    }

    private void RunScript(object sender, DoWorkEventArgs e)
    {
        dynamic script = CSScript.Evaluator.LoadCode(@"using System;
                                using System.Threading;
                                 public class Script
                                 {
                                     public string Test()
                                     {
                                        {int count=0; while(true) { count++; Console.WriteLine(count.ToString()); Thread.Sleep(200); }}

                                        return ""Message from script"";
                                     }
                                 }");

        e.Result = script.Test();
    }

    private void OnStop(object sender, RoutedEventArgs e)
    {
        if(worker == null)
        {
            return;
        }

        //TODO: How do I stop the script here?

        worker = null;
    }
}
EN

回答 1

Stack Overflow用户

发布于 2017-04-03 14:18:22

在您的Test()方法中,添加一个将CancellationToken传递给脚本的参数。然后在脚本中设计循环,以检查canellation令牌是否已被请求中止和中断。要停止脚本,只需调用CancellationTokenSource的Cancel()方法,调用时将令牌传递给脚本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38508960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档