繁体   English   中英

调用异步方法时未将对象引用设置为对象的实例

[英]Object reference not set to an instance of an object when calling asynchronous method

Twitter 不通过其 REST API 提供用户生日。 因此,我准备了一个可为空的 DateTime 属性。

我还为所有社交网络服务准备了一个接口。 它们中的大多数是异步任务方法。

但我无法传递此错误:对象引用未设置为对象的实例,即使我没有使用该对象。

接口方法 GetUserBirthDayAsync 针对 Twitter 服务实现如下:

public Task<DateTime?> GetUserBirthDayAsync(){
    return null; // because twitter does not provide user birthday
}

这就是我使用该方法的方式:

DateTime? BirthDate = await socialNetworkService.GetUserBirthDayAsync();

将值设置为 BirthDate 变量时发生错误。

发生了什么? 是什么导致异常?

试试这个:

public Task<DateTime?> GetUserBirthDayAsync()
{
    return Task.Run(() => (DateTime?)null);
}

或者,更好的方法来做同样的事情:

public Task<DateTime?> GetUserBirthDayAsync()
{
    return Task.FromResult<DateTime?>(null);
}

当您只返回null ,这意味着您的 Task 是null ,而不是异步方法的结果。

另一种方法可能是只使用Task.FromResult<DateTime?>(null)

作为。

public Task<DateTime?> GetUserBirthDayAsync()
{
    return Task.FromResult<DateTime?>(null);
}

MSDN 文档

创建一个以指定结果成功完成的任务。

与其他选项几乎相同,但恕我直言,它看起来更干净。

您在 null 上调用 await。 我想你有这样的想法:

public Task<DateTime?> GetUserBirthDayAsync(){
    return Task.Run(() => (DateTime?)null); // because twitter does not provide user birthday like faceBK
}

即使我没有使用该对象

是的,您正在使用该对象。 null的对象是您从GetUserBirthDayAsync()返回的Task<DateTime?> 当您尝试await此任务时使用它。

因此NullReferenceExceptionawait (或编译器为其创建的代码)引发。

所以你可能想要做的是返回一个Task<DateTime?> ,它返回一个null作为结果类型:

public Task<DateTime?> GetUserBirthDayAsync(){
    return Task.Run(() => (DateTime?)null);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM