可能执行异步调用的方法的临时出口

问题描述 投票:0回答:2

我在调用一个方法时可能遇到问题,该方法可能会根据初始同步查找调用的结果返回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

这甚至是正确的方法吗?

c# async-await configureawait
2个回答
1
投票

按照您的建议,最好返回一个Task<T>,它包含


1
投票

仅返回一个结果为空值的Task

© www.soinside.com 2019 - 2024. All rights reserved.