我在调用一个方法时可能遇到问题,该方法可能会根据初始同步查找调用的结果返回Task<T>
或null
(这本身可能是反模式,所以请告诉我)。
我有点想在发生琐碎的退出情况时返回null
,但这会导致调用(外部)方法失败,因为外部调用期望一个Task<T>
响应(琐碎的退出),该响应会被推送到[C0 ],随后产生ConfigureAwait(true)
。
外部呼叫方法:
NullReferenceException
中间方法:
var res = await MyService.GetUserCourseStatusAsync(userID, productID).ConfigureAwait(true);
所以我当时的想法是,我们应该始终返回public Task<IGetUserCourseResponse> GetUserCourseStatusAsync(int userID, int productID)
{
// Look up User's ID (if exists)
var userCredentials = GetUserCredentials(userID);
if (userCredentials?.UserID == null)
return null; // Trivial return of null ("User not registered"). *** This causes exception on ConfigureAwait(true) above ***
// Another synchronous call
var courseId = GetCourseID(productID);
if (courseId == null)
throw new InvalidOperationException($"Product #{productID} is not a course");
// Asynchronous call to inner method (this bit works fine)
return GetUserCourseAsync(userCredentials.UserID.Value, courseId.Value);
}
而不是Task<T>
。但是,所有这些都会导致编译错误:
null
如何返回不是异步调用结果的虚拟//return null; // Trivial return of null ("User not registered"). *** This causes exception
// Compile error: CS0029: Cannot implicitly convert type 'GetUserCourseInner' to 'System.Threading.Tasks.Task<IGetUserCourseResponse>'
return new GetUserCourseInner(); // Not registered
// Compile error: CS1503 Argument 1: cannot convert from 'GetUserCourseInner' to 'System.Func<IGetUserCourseResponse>'
return new Task<IGetUserCourseResponse>(new GetUserCourseInner()); // Not registered
?
这甚至是正确的方法吗?
按照您的建议,最好返回一个Task<T>
,它包含
仅返回一个结果为空值的Task