2015-10-27 40 views
0

我想提高我的web应用程序的对未来的可扩展性问题的表现,异步性的ASP MVC

一个场景,我想的是,如果我需要,需要从数据库过滤列表。

这里是草稿,我提出:

public IEnumerable<test> getL(IEnumerable<test> filter) 
{ 
     //do some filtering from the list then return it 
     return filter; 
} 



public async Task<ActionResult> Index() 
{ 
     context con = new context();  
     //do more stuff of stuff 
     IEnumerable<test> get = await Task.Run(() => { return getL(con.dep.ToList()); }); 
     return View(get); 
} 

我与C#的不同步,所以我还挺想知道如果我这样做正确的还挺新。我是否正确启动异步呼叫?

+0

这可能更适合https://codereview.stackexchange.com/?但是,代码看起来为我工作。数据库任务完成时,将等待对“索引”的请求。根据您的数据库访问方法,您可能会等待调用数据库。例如。如果你使用的是Dapper,那么就有异步方法。 –

+0

所以当它到达等待线时,它会等到任务结束? –

+1

它将实际上服务于另一个web请求,直到任务完成,因此是异步部分。在非异步世界中,线程将被占用,直到整个索引方法完成,因此这可能会提高性能。 –

回答

1

在ASP.NET上,您应该避免使用Task.Run。这是因为Task.Run将通过使用另一个线程释放当前线程。所以你会无缘无故地接受额外的上下文切换。此代码将减少的可扩展性和性能,而不是增加它。

而是使用await来执行基于I/O的任务。例如,从数据库获取数据:

public async Task<ActionResult> Index() 
{ 
    context con = new context();  
    var list = await con.dep.ToListAsync(); 
    IEnumerable<test> get = getL(list); 
    return View(get); 
} 
+0

我明白了,谢谢。我有点新,所以你可以给我更多的基于I/O的任务的例子吗? –

+1

@CarlosMiguelColanta:读取或写入文件,HTTP请求和数据库调用是最常见的。 –