【问题标题】:Can not use await + Result.Error:- 'string' does not contain a definition for 'GetAwaiter' and no accessible extension method 'GetAwaiter'无法使用 await + Result.Error:-“字符串”不包含“GetAwaiter”的定义,并且没有可访问的扩展方法“GetAwaiter”
【发布时间】:2020-06-30 11:05:39
【问题描述】:

我的 asp.net 核心 mvc 中有以下代码:-

var result = await _context.Settings.SingleOrDefaultAsync(a => a.Name.ToLower() == "noofvisits").Result.Value;

但我得到了这个错误:-

Error   CS1061  'string' does not contain a definition for 'GetAwaiter' and no accessible extension method 'GetAwaiter' accepting a first argument of type 'string' could be found (are you missing a using directive or an assembly reference?)

那么为什么我会收到这个错误? 谢谢

【问题讨论】:

  • 嗨@test test,只要使用var result = await _context.Settings.SingleOrDefaultAsync(a => a.Name.ToLower() == "noofvisits");就可以得到name等于noofvisits的值。
  • 嗨@test test,我的回答对您解决问题有帮助吗?

标签: asp.net-core asynchronous .net-core asp.net-core-mvc


【解决方案1】:

您正在为一个异步调用指定一个await,您随后会阻止该调用的结果。通过添加.Result,您的代码现在可以同步运行,返回一个字符串而不是一个可以等待的任务,这就是await 关键字的含义。

SingleOrDefaultAsync() 的返回类型是Task<T>,其中T 是应该返回的任何数据类型。使用await,您是在告诉您的代码“嘿,只要该任务完成并给我一个结果,我就在等待那个结果”。

如果预期的数据类型已经是一个字符串,你不需要做任何事情,你会得到一个字符串:

string result = await _context.Settings.SingleOrDefaultAsync(a => a.Name.ToLower() == "noofvisits");

如果是比较复杂的POCO,或者是你得到结果后需要同步抓取字符串,那么你可以在任务完成后进行:

var result  = await _context.Settings.SingleOrDefaultAsync(a => a.Name.ToLower() == "noofvisits");
string yourString = result.DoWhateverHere();

【讨论】:

  • 但是如果我删除了.Result.Value,我怎么能得到Value
  • 因为我无法提及以下内容await _context.Settings.SingleOrDefaultAsync(a => a.Name.ToLower() == "noofvisits").Value
  • SingleOrDefaultAsync() 方法返回一个Task<T>,其中T 是底层返回类型。如果这已经是一个字符串,则您无需执行任何操作; await 正在等待任务完成并为您提供结果。如果它是更复杂的类型,您需要同步提取字符串,则让await 处理result,然后在以下代码行中操作result(即result.DoAThing())跨度>
  • 您能否提供一个回复示例?
  • 顺便说一句,这是一本好书:markheath.net/post/async-antipatterns
【解决方案2】:

如果要获取单个对象,请使用:

var result = await _context.Settings
                           .SingleOrDefaultAsync(a => a.Name.ToLower() == "noofvisits");

如果要获取对象中的单个属性,请使用:

var result = await _context.Settings.Where(a => a.Name.ToLower() == "noofvisits")
                                    .Select(s => s.PropertyName).FirstOrDefaultAsync();

【讨论】:

    猜你喜欢
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 2019-05-05
    • 1970-01-01
    • 2012-08-04
    • 2017-04-20
    相关资源
    最近更新 更多