C#异步等待:如何为下面显示的示例编写异步方法?

时间:2019-10-17 15:42:26

标签: c# async-await

这是代码段,我得到警告:

  

此异步方法缺少等待操作符,将同步运行。考虑使用await运算符来等待非阻塞调用。

    public async Task<ActionResult> CreateRequest([FromBody] DnsRecordDto RecordRequested)
    {
        var result = IsRecordRequestedNull()
    }

    public bool IsRecordRequestedNull(DnsRecordDto RecordRequested)
    {
        bool flag = false;
        if (RecordRequested == null)
        {
            flag = true;
            _commonRepository.SaveLogItem(Constants.TransactionFailedBadData, Constants.STARTING, transId, LogLevel.Trace);
        }
        return flag;
    }

我不确定如何解决此警告

我真的需要用async关键字修饰IsRecordRequestedNull并使它运行异步,只是因为我是从async方法调用此方法吗?

在这种情况下,我应该忽略出现的警告吗??

2 个答案:

答案 0 :(得分:10)

使用async关键字本身不会使方法异步运行。它仅允许使用await运算符。如果您不使用await,请不要使用async

警告只是说:“您没有使用await,为什么要使用async?”

如果您不使用或不能使用await,则解决方法是删除async关键字:

public ActionResult CreateRequest([FromBody] DnsRecordDto RecordRequested)
{
    var result = IsRecordRequestedNull()
}

如果该SaveLogItem方法有一个异步版本(也许是SaveLogItemAsync?),那么您可以等待它并制作所有async

public async Task<ActionResult> CreateRequest([FromBody] DnsRecordDto RecordRequested)
{
    var result = await IsRecordRequestedNull()
}

public async Task<bool> IsRecordRequestedNull(DnsRecordDto RecordRequested)
{
    bool flag = false;
    if (RecordRequested == null)
    {
        flag = true;
        await _commonRepository.SaveLogItemAsync(Constants.TransactionFailedBadData, Constants.STARTING, transId, LogLevel.Trace);
    }
    return flag;
}

但是我不知道该SaveLogItem方法的来源,所以我不能说是否有一个异步版本可供您使用。

如果这是您自己编写的方法,并且希望它异步运行,那么这就是您需要开始的地方。查看它在哪里执行任何I / O操作(读取/写入文件,发出网络请求等),并将其更改为使用这些调用的async版本(通常带有后缀“ Async”)并等待它们。然后,您可以将该方法及其调用的任何方法更改为async

Microsoft有一系列关于异步编程的非常出色的文章,您可能会从中受益:Asynchronous programming with async and await

答案 1 :(得分:1)

您的方法用 async 关键字修饰,这意味着您想异步运行代码,但是 async 关键字本身不执行任何操作,您必须在您的方法主体中的某个位置进行 await 。因此,就像@Gabriel Luci所建议的那样,检查是否有SaveLogItem的异步版本,以便可以 await 。如果没有,只需删除 async ,就可以了。