如何处理c#中await任务返回null的情况

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

我在处理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
}
c# .net razor async-await
1个回答
0
投票

如果您已将方法标记为

async
,则无需使用
Task.FromResult
并另外等待它。你可以简单地写
return null;

Task.FromResult
用于返回已完成的任务及其结果集。当你有方法并且没有标记
async
并且你想要返回不需要等待的结果时使用它。示例

public Task<int> Method()
{
    return Task.FromResult(1);
}

这样的实现没有多大意义,但它很有用,例如,当您必须从接口实现异步方法,但您的实现是完全同步的时。

在您的场景中,您已经有了

async
方法,并且可以直接返回结果,而无需将它们包装在
Task
中。

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