处理异步ASP中来自异步任务的错误.网络页面

本文关键字:异步 错误 网络 ASP 处理 任务 | 更新日期: 2023-09-27 18:03:45

我有一个异步ASP。网页(Async="true"),代码如下:

如果在异步任务方法'DoTask1'中发生错误,那么似乎它不是由ASP处理的。Net页面框架等正常错误。

我尝试在EndAsyncOperation1方法中获得Server.GetLastError(),但即使在DoTask1方法中发生错误,它也会返回null。是否有一些特殊的方法来处理异步任务中发生的错误?

    protected void btnSave_Click(object sender, EventArgs e)
    {
              PageAsyncTask pagetask1 = new PageAsyncTask(new BeginEventHandler(BeginAsyncOperation1),
                    new EndEventHandler(EndAsyncOperation1),
                    new EndEventHandler(TimeoutAsyncOperation1),
                    new object[] { employeeId, totalEarnings }, true);
                RegisterAsyncTask(pagetask1);
    }
    //Async Task method below is called by the registered task
    private void DoTask1(object[] paras)
    {
            //line below throws an exception on the async task thread
            string x = null;
            string y = x.Trim();
           //More code come here
     }
   IAsyncResult BeginAsyncOperation1(object sender, EventArgs e, AsyncCallback cb, object state)
    {
        task1 = new AsyncTaskDelegate(DoTask1);
        IAsyncResult result = task1.BeginInvoke(state as object[], cb, "task1");
        return result;
    }
   void EndAsyncOperation1(IAsyncResult ar)
    {
        task1.EndInvoke(ar);
        if (success1 == null)
        {
            success1 = true;
        }
    }
    void TimeoutAsyncOperation1(IAsyncResult ar)
    {
        success1 = false;
    }

处理异步ASP中来自异步任务的错误.网络页面

我终于找到了问题的答案。

在处理ASP中的异步任务错误时,可以遵循两种方法。用Async = "true"标记的网页。请注意,在这个问题中代码调用的asynn任务方法是'DoTask1'。

  • 方法1:不要在try catch中包含任何内容,即使是作为异步任务执行的代码,作为默认的ASP。Net错误处理将在ASP.Net中发挥作用。因此,如果您的页面以ajax回发方式发送,那么ScriptManager的AsynError事件将触发,您可以在此事件中做任何您喜欢的事情,或者如果它是非ajax回发,则在页面级别使用Page_Error事件来处理错误。示例代码如下:

    在我的例子中是Server。GetLastError返回null,因为我正在清除ScriptManager的AsyncError事件中的错误(即Server.ClearError)。

     protected void radScriptManager_AsyncPostBackError(object sender, 
                                         System.Web.UI.AsyncPostBackErrorEventArgs e)
    {
        //log the exception using ELMAH or any other logging mechanism
        Exception ex = Server.GetLastError() ;
        if (ex != null)
        {
            Exception bex = ex.GetBaseException();
            if (bex != null)
            {
                Elmah.ErrorSignal.FromCurrentContext().Raise(bex);
            }
        }
        Server.ClearError();
    }
    
  • APPROACH 2:第二种方法涉及将EndAsyncOperation1中的EndInvoke方法调用放在try catch中。 EndInvoke方法的美妙之处在于,它会重新抛出发生在异步任务方法上的异常。'DoTask1'),因此我们可以捕获它并处理它,如下面的代码所示。在这种情况下,我使用ELMAH来记录和处理错误,但是您可以使用任何日志机制。

    当使用第二种方法时,不需要将代码放在async任务方法中的try catch中,因为如果在async方法中发生错误,那么它将自动传播到EndInvoke方法。

       void EndAsyncOperation1(IAsyncResult ar)
    {
        try
        {
            task1.EndInvoke(ar);
            success1 = true;
        }
        catch (Exception e1)
        {
            success1 = false;
            //log the exception (this will log error and also send out an error email)
            Elmah.ErrorSignal.FromCurrentContext().Raise(e1);
        }
        if (success1 == null)
        {
            success1 = true;
        }
    }