2015-05-04 43 views
1

我想在MVC 6中實現一個異步組件,我掙扎着。異步組件不工作在MVC 6

查看代碼:

@await Component.InvokeAsync("GetTextA") 
@Component.Invoke("GetTextB") 

構成元素A碼:

public class GetTextAViewComponent : ViewComponent 
{ 
    public async Task<IViewComponentResult> InvokeAsync() 
    { 
     await Task.Delay(12000); 
     return View("Default","from code"); 
    } 
} 

組分B編碼:

public class GetTextBViewComponent : ViewComponent 
{ 
    public IViewComponentResult Invoke() 
    { 
     return View("Default"); 
    } 
} 

它需要多於12000毫秒加載視圖。這意味着異步組件被同步加載。

如何異步加載視圖中的所有內容,而不是等待異步組件加載。

+1

嗯,你告訴任務等待12000毫秒... HTTPS://msdn.microsoft.com/en-us/ library/hh194873%28v = vs.110%29.aspx –

+0

是的,等待代碼有意添加,以找到異步任務同步工作的原因 – Rad

+2

您的異步任務不工作同步,它的事實,視圖必須等待它在渲染之前完成。 –

回答

3

如果您希望視圖渲染並在稍後運行異步代碼,則基本上必須使用Ajax。運行組件async意味着它不會阻塞線程,並且可以被其他請求重用。

編輯: 如果要渲染頁面的頂部,並在稍後顯示其餘部分,則可以使用新的@Flush功能。在長時間運行任務之前添加對@await FlushAsync()的呼叫,並將視圖的頂部刷新到客戶端。如果您使用的佈局變得有點複雜,按照這個測試更多的例子:

https://github.com/aspnet/Mvc/tree/9ea535027153094d547c2c001999b16a2598fbac/test/WebSites/RazorWebSite/Views/FlushPoint

+0

我無法找到'Flush' ...什麼是命名空間?文檔在哪裏? – VSG24

0

在下面的例子中可以看到,儘管這兩種成分都有,每組6秒的延遲,它並不需要12秒來呈現響應。事實證明,可以異步調用視圖組件,這可以有效節省CPU時鐘週期,並使其能夠提供比以前更多的同步請求。

AViewComponent

public async Task<IViewComponentResult> InvokeAsync() 
    { 
     await Task.Delay(6000); 
     return View<string>("Hello World A!"); 
    } 

BViewComponent

public async Task<IViewComponentResult> InvokeAsync() 
    { 
     await Task.Delay(6000); 
     return View<string>("Hello World B!"); 
    } 

視圖\共享\組件\ A \ Default.cshtml

@model string 

<h1>@Model</h1> 

視圖\共享\組件\ B \ Default.cshtml

@model string 

<h1>@Model</h1> 

index.cshtml

@DateTime.Now 

@{ 
    var taskA = Component.InvokeAsync("A"); 
    var taskB = Component.InvokeAsync("B"); 

    taskA.Wait(); 
    taskB.Wait(); 
} 

@taskA.Result 
@taskB.Result 

@DateTime.Now 

輸出(見6秒的時間差)

2016年6月14日下午6時09分04秒

的Hello World阿!

Hello World B!

2016年6月14日下午6時09分10秒