4

我在下面的代码中面临 NullPointerException,因为它很少发生,我尝试调试以复制该问题但没有运气。任何人都可以帮助我这里可能导致 NullPointerException 的原因。

private static void MyTaskCompletedCallback(IAsyncResult res)
    {
        var worker = (AsyncErrorDelegate)((AsyncResult)res).AsyncDelegate;
        var async = (AsyncOperation)res.AsyncState;
        worker.EndInvoke(res);
        lock (IsAsyncOpOccuring)
        {
            IsBusy = false;
        }
        var completedArgs = new AsyncCompletedEventArgs(null, false, null);
        async.PostOperationCompleted(e => OnTaskCompleted((AsyncCompletedEventArgs)e), completedArgs);
    }

在 var async = (AsyncOperation)res.AsyncState; 处报告空指针异常;

我调用它的代码

 var context = HttpContext.Current;
        AsyncErrorDelegate bkWorker = SendErrorMail;
        AsyncCallback completedCallback = MyTaskCompletedCallback;
        lock (IsAsyncOpOccuring)
        {
            if (IsBusy)
            {
                //Do we need to do something if repeated async getting call in case of error occuring at same time by different users.

            }

            AsyncOperation async = AsyncOperationManager.CreateOperation(null);
            bkWorker.BeginInvoke(context,completedCallback, async);
            IsBusy = true;
        }
4

2 回答 2

2

空指针异常报告在var async = (AsyncOperation)res.AsyncState;

我们可以从逻辑上推断出事实并非如此。

如果之前的行有效,我们知道它res不为空。AsyncStateis object,因此这里不涉及自定义运算符,这意味着强制转换是一种类型检查 - 它可以返回null(没有错误),也可以引发无效强制转换异常。

如果您看到 a NullReferenceException,则留下 2 个选项:

  • res是 null 并且是上面的行出错(这:我们实际上不应该期望 - 这不会发生)
  • 错误实际上来自,之后EndInvoke的行

(当涉及到异常时,确切的行经常会有点混乱)。

我建议您在每个之间添加日志记录,以跟踪正在发生的事情。我还建议您明确地try围绕EndInvoke,因为这可能会引发异常(它会重新引发异步操作中的任何异常)。

在更一般的情况下,第三种选择是:

  • AsyncOperation是一个struct,并且AsyncStatenull

但是,在这种情况下,我们可以通过演绎排除这种情况,因为如果AsyncOperation是 a struct,则以下内容永远不会框到null(只有空的AsyncOperation?框会框到null):

AsyncOperation async = AsyncOperationManager.CreateOperation(null);
bkWorker.BeginInvoke(context,completedCallback, async);
于 2012-11-21T11:14:00.510 回答
1

应该

var async = (AsyncOperation)asyncResult.AsyncState;

不是

var async = (AsyncOperation)res.AsyncState;

?

于 2012-11-21T11:00:38.910 回答