2016-05-26 26 views
1

您好,我試圖有條件地返回一個異步方法任務。以下是我嘗試的方式。異步任務如何有條件地返回

public string DoMessage(MyObj obj) 
    { 
     string returnStatus = "Processing..."; 
     var storageAccount = CloudStorageAccount.DevelopmentStorageAccount; 
     var queueClient = storageAccount.CreateCloudQueueClient(); 

     var queue = queueClient.GetQueueReference(ConfigurationManager.AppSettings["QueueName"]); 
     if (queue.CreateIfNotExists())   { 
     } 

     var msg = CloudQueueMessageExtensions.Serialize(obj); 
     queue.AddMessage(msg); 

     //Task processTask = RunMessageProces(); 
     var t = Task.Run(() => RunMessageProces()); 
     t.Wait(); 
     return returnStatus; 
    } 

    private async Task<string> RunMessageProces() 
    { 
     statusProcess = "Your message successfully inserted in process queue."; 
     await Task.Run(() => { 
      lock (_oQueue) 
      { 
       if (flagProcessing == true) //return when queue processing alredy started 
       { 
        return statusProcess; //Error ..??? how to return 
       } 
       flagProcessing = true; //else start processing the queue till there are messages. 
      } 
     }); 
     statusProcess = ProcessMyMessage(); 
     return statusProcess; 
    } 

    private string ProcessMyMessage() {...} 

我失蹤了什麼?如何在有條件地返回字符串之間的異步方法裏面也存在等待鎖匿名塊(?)。我在任務中進行異步操作,因爲由於服務的暴露部分,「消息」同時充斥着大量呼叫。

+0

Hy,請問您能舉一個最小的跑步例子,我們可以試試嗎? –

+0

這裏它公共字符串DoMessage(){var t = Task.Run(()=> RunMessageProces());} 私人異步任務 RunMessageProces()//異步任務 {statusProcess =「MSG」。 ;等待Task.Run(()=> {//第一個錯誤在這裏...... lock(_oQueue){if(flagProcessing == true){return statusProcess; // SECOND ERROR HERE。 } flagProcessing = true; // else開始處理隊列直到有消息。 }}); statusProcess = BigTimeConsumingProcess();返回statusProcess;} – AKS

回答

2

我假設你問如何從任務訪問返回的值。

private async Task<string> RunMessageProces() 
    { 
     var statusProcess = "Your message successfully inserted in process queue."; 
     var retValue = await Task.Run(() => 
     { 
      lock (_oQueue) 
      { 
       if (flagProcessing == true) //return when queue processing alredy started 
       { 
        return "Error"; // or some such error indicator 
       } 
       flagProcessing = true; //else start processing the queue till there are messages. 
      } 
      return string.Empty; // return a string here too.... 
     }); 

     // if(retValue == "Error") { return "Error" } 
     statusProcess = ProcessMyMessage(); 
     return statusProcess; 
    } 
+0

嗨shr,請注意內部鎖返回給出錯誤。首先是等候Task.Run語句,「並非所有的代碼路徑都返回類型爲'System.Func '(我不需要總是返回但是有條件地)的lambda表達式中的值,而第二個返回錯誤「Error」聲明「無法將類型字符串隱式轉換爲System.Threading.Tasks.Task」。 – AKS

+0

@AKS,它正在爲我工​​作。要解決第一個錯誤,您需要在鎖定塊之後或if塊之後的返回字符串。我有一個返回string.Empty在我的代碼。粘貼更新的代碼,以便我可以看看。 – shr

+0

謝謝你,我明白了,錯誤地認爲返回「錯誤」;內部鎖從函數RunMessageProces返回,但它實際上只返回到Task.Run。你的額外代碼像var retValue =和最後一個註釋檢查打開了知識的大門。非常感謝。 – AKS