我在处理await Task 返回null 情况时遇到一个问题。 在下面的代码中,如果 GetByName() 方法返回 null。然后在我的调用代码中 GUI 将出现以下异常。我认为这是因为 GetByName() 返回 null 并且我使用等待调用它。 我想知道有没有更好的方法来处理这种情况?我的目的是当 return 不为 null 时做一些事情,如果 return 为 null 则做其他事情。两者都符合逻辑。
blazor.webview.js:1 One or more errors occurred
(Status(StatusCode="Cancelled", Detail="No message returned from method."))
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
at DataView2.Pages.Dataset.ImportDataset.PickFileFath()
at Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion(Task task)
at MudBlazor.MudBaseButton.OnClickHandler(MouseEventArgs ev)
at Microsoft.AspNetCore.Components.RenderTree.Renderer.GetErrorHandledTask(Task taskToHandle, ComponentState owningComponentState)
public async Task<DatabaseRegistry> GetByName(string datasetName)
{
try
{
var entities = await _repository.GetAllAsync();
var returnValue = entities.FirstOrDefault(e => e.Name == datasetName);
if (returnValue == null)
return await Task.FromResult<DatabaseRegistry>(null); // here I mean return null
else
return returnValue;
}
catch (Exception ex)
{
// Log the exception
Console.WriteLine($"Error: {ex.Message}");
// Optionally, throw a gRPC-specific error to return a meaningful message
throw new RpcException(new Status(StatusCode.Internal, "An error occurred while retrieving the database."));
}
}
// Below is the code to invoke GetByName method
var curDbService = await appEngine.DatabaseRegistryService.GetByName(result.FileName);
if (curDbService != null)
{
// Do something here
}
else
{
// Do others
}
如果您已将方法标记为
async
,则无需使用Task.FromResult
并另外等待它。你可以简单地写return null;
Task.FromResult
用于返回已完成的任务及其结果集。当你有方法并且没有标记 async
并且你想要返回不需要等待的结果时使用它。示例
public Task<int> Method()
{
return Task.FromResult(1);
}
这样的实现没有多大意义,但它很有用,例如,当您必须从接口实现异步方法,但您的实现是完全同步的时。
在您的场景中,您已经有了
async
方法,并且可以直接返回结果,而无需将它们包装在 Task
中。