c# - C#中的空指针异常

标签 c# c#-4.0 asynchronous

我在下面的代码中遇到了 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;
        }

最佳答案

Null Pointer exception is reported at var async = (AsyncOperation)res.AsyncState;

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

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

如果您看到 NullReferenceException,则还有 2 个选项:

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

(当涉及异常时,确切的行经常会有点困惑)。

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

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

  • AsyncOperation 是一个structAsyncStatenull

但是,在这种情况下,我们可以通过推论来排除这种情况,因为如果 AsyncOperation 是一个 struct,则以下内容永远不会框到null(只有一个空的 AsyncOperation? 才会装箱到 null):

AsyncOperation async = AsyncOperationManager.CreateOperation(null);
bkWorker.BeginInvoke(context,completedCallback, async);

关于c# - C#中的空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13491758/

相关文章:

javascript - 如何处理多个异步请求?

c# - 将 C# 字符串生成器传递给 C DLL 的 C++ 包装器

c# - C# 中的用法池

asp.net-mvc - 坚持使用 ASP.NET MVC4 中的 Google API YouTube 搜索示例?

asp.net-mvc - Web API 模型绑定(bind)与 Multipart formdata

c# - 如何在 WPF 中向后播放视频?

c# - WCF 捕获异步异常

c# - 当多个实例运行时,使用ASP.NET重置密码时无效的 token

c# - 使用异步等待的并行多线程下载

wcf - POST/PUT静态服务的URI模板