2016-05-16 9 views
0

Ich arbeite an MVC C# Razor Framework 4.6.Update UI mit Teilansicht als Antwort auf Task ausgeführt (Async)

Ich habe statische Methode ExportManager.ExportExcelCannedReportPPR eingewickelt in Task.Run für lange laufende Bericht. Diese Methode gibt boolean Wert zurück und basierend auf dieser bin ich Teilansicht aktualisieren (_NotificationPanel).

public ActionResult ExportCannedReport(string cannedReportKey, string cannedReportName) 
{    
    string memberKeys = _curUser.SecurityInfo.AccessibleFacilities_MemberKeys; //ToDo: Make sure this is fine or need to pass just self member? 
    string memberIds = _curUser.SecurityInfo.AccessibleFacilities_MemberIDs; //ToDo: Make sure this is fine or need to pass just self member? 
    string curMemberNameFormatted = _curUser.FacilityInfo.FacilityName.Replace(" ", string.Empty); 
    string cannedReportNameFormatted = cannedReportName.Replace(" ", string.Empty); 
    string fileName = string.Concat(cannedReportNameFormatted, "_", DateTime.Now.ToString("yyyyMMdd"), "_", curMemberNameFormatted); 
    //ToDo: Make sure below getting userId is correct 
    string userId = ((_curUser.IsECRIStaff.HasValue && _curUser.IsECRIStaff.Value) ? _curUser.MembersiteUsername : _curUser.PGUserName); 

    var returnTask = Task.Run<bool>(() => ExportManager.ExportExcelCannedReportPPR(cannedReportKey, cannedReportName, fileName, memberIds, userId)); 
    returnTask.ContinueWith((antecedent) => 
    { 
     if (antecedent.Result == true) 
     { 
      return PartialView("_NotificationPanel", "New file(s) added in 'Download Manager'."); 
     } 
     else 
     { 
      return PartialView("_NotificationPanel", "An error occurred while generating the report."); 
     } 
    }, TaskContinuationOptions.OnlyOnRanToCompletion); 

    return PartialView("_NotificationPanel", ""); 
} 

Jetzt Problem ist, dass UI nicht einmal aufzufrischen bekommen konnte, obwohl _NotificationPanel in ContinueWith ausgeführt werden sollen.

+0

Was erwarten Sie wirklich mit diesem Code? –

Antwort

1

Das Problem ist, dass, sobald Sie von ihm zurückkommen - diese Anfrage erledigt ist. Sie können nicht mehrmals für eine einzelne Anfrage davon zurückkehren. Die Anfrage und die Antwort sind 1: 1. Sie müssen async und await hier verwenden, so dass, wenn der Export dann erfolgt ist und nur dann ein Ergebnis zurückgibt.

public async Task<ActionResult> ExportCannedReport(string cannedReportKey, 
                string cannedReportName) 
{    
    // Omitted for brevity... 

    var result = 
     await Task.Run<bool>(() => 
      ExportManager.ExportExcelCannedReportPPR(cannedReportKey, 
                cannedReportName, 
                fileName, 
                memberIds, 
                userId)); 

    return PartialView("_NotificationPanel", 
     result 
      ? "New file(s) added in 'Download Manager'." 
      : "An error occurred while generating the report."); 
} 

Sie müssen die Methode Task Rückkehr so ​​machen, dass es „awaitable“ ist. Dann markieren Sie die Methode als async, die das Schlüsselwort await aktiviert. Schließlich sind Sie bereit, die lange laufende Aufgabe auszuführen und aus dem Ergebnis die gewünschte Teilansichtsaktualisierung korrekt zu ermitteln und zurückzugeben.

aktualisieren

Alternativ können Sie einen AJAX Anruf auf dem Client und aktualisieren, sobald der Server antwortet nutzen. Für Details zu diesem speziellen Checkout MSDN.

+0

Danke David. Tatsächlich hält dies den Benutzer auf andere Funktionen zugreifen. Der Benutzer kann auf andere Funktionen zugreifen, sobald die Ausführung von Task.Run abgeschlossen ist. Am Ende wird es die Synchronisierungsmethode sein. Können Sie bitte Ihren Vorschlag machen? –