2011-01-23 131 views
2

我有一個使用ASP.NET MVC 1開發的「博客」網站。最近的MVC版本包含AsyncController功能。這實際上需要一些額外的開發任務。但是,如何在不修改業務層的情況下重用我現有的代碼。ASP.NET MVC中的異步控制器

代碼的某些部分是這樣的:

BlogPost post = new BlogPost(); 
post.GetPost(58345); 

BlogComment comments = new BlogComment(); 
comments.GetComments(58345); 

按照目前的環境下,我需要等到請求完成兩個操作。使用AsyncController,我可以同時執行兩個操作。但類BlogPost和BlogComment需要更改爲支持異步操作,如添加EventHandlers以瞭解操作是否已完成等。

如何在不修改現有業務層的情況下執行異步操作。

+0

Max,你能找到解決方案嗎?我在一個類似的船,並希望使用AsyncController調用我現有的業務邏輯層(BLL)方法Asynchronoulsy而不修改或添加EventHandlers到我的BLL。我將非常感謝您的回覆/建議。你可以在這裏看到我的問題:http://stackoverflow.com/questions/5760285/changing-synchronous-operations-into-asynchronous-in-business-service-repositor – Alex 2011-04-25 07:59:10

回答

2

首先,你爲什麼認爲你需要做異步控制器?您是否遇到一些您認爲異步會幫助您的性能問題?如果你真的不需要它,爲什麼使用Async處理應用程序變得複雜?

異步實際上是設計來處理更大規模的擴展,或者當您需要在控制器中執行非cpu綁定操作時,可能需要很長時間才能執行。

其次,我認爲你對Async控制器的操作有些困惑。在大多數情況下,您不需要修改業務層,只需創建一個異步「填充程序」來包裝業務層。異步並不意味着「多線程」。它仍然會爲每個請求執行一個線程,並且您仍然會調用您的業務邏輯單線程(除非您編寫代碼來執行多線程操作)。

所有異步控制器都可以更好地利用線程池。當你有沒有CPU綁定的線程時,它們可以返回到線程池,同時等待你的請求被重新激活,從而允許線程池更好地使用,而不是使用一個線程無所事事,而是等待。

如果您需要調用多個操作,請使用AsyncManager.OutstandingOperations屬性來控制完成請求所需的操作數。

3

你可以這樣做:

public class BlogController : AsyncController 
{ 
    private readonly IBlogRepository _repository; 
    public BlogController(IBlogRepository repository) 
    { 
     _repository = repository; 
    } 

    public void ShowAsync(int id) 
    { 
     AsyncManager.OutstandingOperations.Increment(2); 
     new Thread(() => 
     { 
      AsyncManager.Parameters["post"] = _repository.GetPost(id); 
      AsyncManager.OutstandingOperations.Decrement(); 
     }).Start(); 
     new Thread(() => 
     { 
      AsyncManager.Parameters["comments"] = _repository.GetComments(id); 
      AsyncManager.OutstandingOperations.Decrement(); 
     }).Start(); 
    } 

    public ActionResult ShowCompleted(Post post, IEnumerable<Comment> comments) 
    { 
     return View(new BlogViewModel 
     { 
      Post = post, 
      Comments = comments, 
     }); 
    } 
} 

你應該測量你的應用程序的性能,並決定是否引入異步控制器帶來的性能的任意值。

+2

在線程池中處理你真的失敗了使用的目的異步控制器。請求由線程池工作人員處理。通過對線程池中的工作進行排隊,您將線程返回到線程池,只能由工作進程再次使用它。更糟糕的是,你現在正在使用兩個線程。 – 2011-01-23 08:54:18