Stop a task from server-side.

  1. #1

    Stop a task from server-side.

    Hi, I extended ProgressBar with a TaskManager,
    //FPPProgress.cs
    public void Stop()
    {
        taskManager.StopTask(task.TaskID);
        //ResourceManager.AddScript("{0}.stopTask('{1}');", this.taskManager.ClientID, task.TaskID);
    }
    
    protected override void CreateChildControls()
    {
        this.Controls.Clear();
        base.CreateChildControls();
    
        task = new Task();
        task.TaskID = "ProgressBarTask";
        task.Interval = 1000;
        task.DirectEvents.Update.Event += new ComponentDirectEvent.DirectEventHandler(OnTick);
        
        taskManager = new TaskManager
        {
            ID = "ProgressTaskManager"
        };
        taskManager.Tasks.Add(task);
        this.Controls.Add(taskManager);
    }
    And then, Creat a window with FppProgressBar Dynamiclly.
    //WebForm.aspx
    protected void Button1_DirectClick(object sender, Ext.Net.DirectEventArgs e)
    {
        ThreadPool.QueueUserWorkItem(LongAction);
        var win = CreatePostDynamicControl("ProgressWindow", "form1", -1,x=> createProgressWindow()) as Window;
    
        win.Render(this.Form);
    }
    
    private Control createProgressWindow()
    {
        var win = new Window()
        {
            ID = "ProgressWindow",
            Title = "请稍候",
            Width = System.Web.UI.WebControls.Unit.Pixel(400),
            Height = System.Web.UI.WebControls.Unit.Pixel(300),
            Collapsible = false,
            Maximizable = false,
            Modal = true
        };
        FPPProgressBar progressBar = new FPPProgressBar();
        progressBar.Interval = 1000;
        progressBar.ID = "ProgressBar";
        progressBar.AutoRun = true;
        progressBar.Tick += new FPPProgressBar.TickHandler(progressBar_Tick);
        win.Items.Add(progressBar);
        return win;
    }
    But Stop() do not work, the client-side error is "Cannot call method 'stopTask' of undefined";
    //FPPProgress.cs
    public void Stop()
    {
        taskManager.StopTask(task.TaskID);
        //ResourceManager.AddScript("{0}.stopTask('{1}');", this.taskManager.ClientID, task.TaskID);
    }
    Last edited by Daniil; Jul 06, 2012 at 4:47 PM. Reason: Please use [CODE] tags
  2. #2
    Hi,

    Welcome to Ext.NET!

    Does this work?
    ResourceManager.AddScript("{0}.stopTask('{1}');", this.taskManager.ClientID, task.TaskID);
    I am unable to reproduce the problem with a simple example.

    Example
    <%@ Page Language="C#" %>
    
    <%@ Register Assembly="Ext.Net" Namespace="Ext.Net" TagPrefix="ext" %>
    
    <script runat="server">
        protected void Stop(object sender, DirectEventArgs e)
        {
            this.TaskManager1.StopTask("Task1");
        }
    </script>
    
    <!DOCTYPE>
    
    <html>
    <head runat="server">
        <title>Ext.NET v2 Example</title>
    </head>
    <body>
        <ext:ResourceManager runat="server" />
    
        <ext:Button runat="server" Text="Stop" OnDirectClick="Stop" />
    
        <ext:TaskManager ID="TaskManager1" runat="server">
            <Tasks>
                <ext:Task TaskID="Task1">
                    <Listeners>
                        <Update Handler="App.Label1.appendLine('You are the best!');" />
                    </Listeners>
                </ext:Task>
            </Tasks>
        </ext:TaskManager>
    
        <ext:Label ID="Label1" runat="server" />
    </body>
    </html>
    Could you provide a full test case to copy, paste and run?
  3. #3

    Thank you.

    Thank you, it doesn`t.
    If I do it this way, creat a TaskManager in a DirectEvent
    protected void Button1_DirectClick(object sender, Ext.Net.DirectEventArgs e)
    {
        Task task = new Task { 
            TaskID="Hello"
        };
        TaskManager taskManager=new TaskManager();
        taskManager.ID = "Progress";
        taskManager.ItemID = "Progress";
        taskManager.Tasks.Add(task);
        taskManager.Render(this.Form);
    }
    the response is
    {
        script: "Ext.net.ResourceMgr.destroyCmp(\"App.Progress\");Ext.create(\"Ext.net.TaskManager\",{proxyId:\"Progress\",itemId:\"Progress\"});"
    }
    How can I get the reference to the Ext.net.TaskManager? The Ext.net assembly I used is "Ext.NET Pro","2.0.0.18341"
    Last edited by Daniil; Jul 12, 2012 at 1:10 PM. Reason: Please use [CODE] tags
  4. #4
    Ok, you create a TaskManager during DirectEvent. But do you recreate it during another request to get its ClientID? It is not recreated automatically.

    It would be best to provide us with a full sample to reproduce the problem.
  5. #5
    Last edited by WiseJiong; Jul 13, 2012 at 1:13 AM.
  6. #6
    Confirm, there is a problem. A dynamically rendered TaskManager doesn't register its id to be accessed.

    We will investigate.

    For now I can suggest the following fix. Add this into the page <head>.

    Fix
    <script type="text/javascript">
        Ext.net.TaskManager.override({
            constructor : function () {
                Ext.net.TaskManager.superclass.constructor.apply(this, arguments);
                Ext.net.ComponentManager.registerId(this);
                this.initManager();
            }
        });
    </script>
    After that you will be able to access a TaskManager in a common way:
    Namespace.TaskManagerID
    The default Namespace is "App".
  7. #7
    Thank you.
  8. #8
    The bug has been fixed in SVN. It will be publicly available with the next 2.1 release.

    Thanks again for the report.

Similar Threads

  1. Replies: 3
    Last Post: Dec 26, 2011, 1:32 PM
  2. I need this code in Server Side
    By walle in forum 1.x Help
    Replies: 1
    Last Post: Jul 20, 2011, 6:58 PM
  3. Replies: 1
    Last Post: Dec 01, 2010, 5:14 PM
  4. Replies: 4
    Last Post: Mar 19, 2010, 11:35 AM
  5. Replies: 6
    Last Post: Sep 01, 2009, 1:06 PM

Posting Permissions