2015-09-06 81 views
0

我与我的EF6 asp.net的MVC 5 Web应用程序内的下列异步方法: -不能等待“长”

public async Task<Resource> GetResourceByName(string resourcename) 
     { 
      return await entities.Resources.SingleOrDefaultAsync(a => a.RESOURCENAME.ToLower() == resourcename.ToLower()); 

     } 

现在我试图让该ID用于从上述方法如下所述返回的对象: -

var temp = await GetResourceByName(FQDN).Result.RESOURCEID; 

但是这将提高以下错误: -

Error 1 Cannot await 'long'

现在要解决这个我做了以下几点: -

var temp = await GetResourceByName(FQDN); 


id = temp.RESOURCEID; 

所以不知道为什么我的第一个apporach没有工作。现在我等待任务,当它完成时,我将检索.Result并获取ResourceID ...为什么这不起作用?

这里是资源模型: -

public partial class Resource 
    { 
     public long RESOURCEID { get; set; } 
     public string RESOURCENAME { get; set; } 
     public Nullable<long> ACQUISITIONDATE { get; set; } 
     public Nullable<long> WARRANTYEXPIRY { get; set; } 
     public Nullable<long> EXPIRYDATE { get; set; } 
     public long COMPONENTID { get; set; } 
     public string ASSETTAG { get; set; } 
     public string SERIALNO { get; set; } 
     public string BARCODE { get; set; } 
     public Nullable<long> PURCHASELOTID { get; set; } 
     public Nullable<long> VENDORID { get; set; } 
     public long RESOURCESTATEID { get; set; } 
     public Nullable<long> SITEID { get; set; } 
     public Nullable<long> CIID { get; set; } 
     public bool ISDEPRECIATIONCONFIGURED { get; set; } 
     public bool ISDEPRECIATIONCALCULATED { get; set; } 
     public bool ISPERSONAL { get; set; } 

     public virtual ComponentDefinition ComponentDefinition { get; set; } 
     public virtual ResourceLocation ResourceLocation { get; set; } 
     public virtual ResourceState ResourceState { get; set; } 
     public virtual SiteDefinition SiteDefinition { get; set; } 
    } 

回答

1

等待任务会给你结果。然后,如果您要下降到结果的属性,你需要,如果你想这一切用括号在一个表达:

var temp = (await GetResourceByName(FQDN)).RESOURCEID; 
+0

感谢您的回复,但正在写入以下正确的“it360id = GetResourceByName(FQDN).Result.RESOURCEID”???或者最好写下“var temp =(await GetResourceByName(FQDN))。RESOURCEID;”如你所说? –

+1

@johnG:不,你不应该使用'Result'。改用'await'。 –

+0

但为什么我应该使用await而不是Result?第二个问题是我在temp变量中存储调用的一种好方法: - “var temp = await GetResourceByName(FQDN); id = temp.RESOURCEID;” –

1

调用上的任务块.Result的线程,直到操作完成。结果对象是该任务在TResult中指定的类型。

你的电话没有工作,因为你不能等待任务的结果,只有任务本身。一旦你致电.Result没有什么可以等待。

+0

所以你的意思是,这应该是正确的“it360id = GetResourceByName(FQDN)。 Result.RESOURCEID;” ??并使用.Result将等待该电话? –

+0

调用'.Result'是有风险的,就好像你错误地使用它会导致死锁。你可以在Stephen Cleary的[博客](http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html) –

+0

上阅读更多的内容,那么我应该怎么写呢?所以你的意思是使用await没有风险,而使用.Result可能导致死锁? –