2016-05-26 7 views
1

こんにちは、非同期メソッドタスクを条件付きで返そうとしています。私が試した方法は以下の通りです。非同期タスクが条件付きで返る方法

私が逃しているものは何ですか?文字列を非同期メソッドの下で条件付きで返す方法。 Do Not Messageは、サービスの一部が公開されているため、同時に多くのコールが氾濫します。

+0

Hyさん、最小限の実行例を教えてください。試してみてください。 –

+0

ここに行く.. public string DoMessage(){var t = Task.Run(>)RunMessageProces());} プライベート非同期タスク RunMessageProces()// asyncタスク {statusProcess = "MSG" ;ここで最初にエラーが発生しました... ロック(_oQueue){if(flagProcessing == true){return statusProcess; //ここで2番目のエラーが発生しました} } flagProcessing = true; // elseメッセージがあるまでキューの処理を開始してください。 }}); statusProcess = BigTimeConsumingProcess(); return 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 」型のラムダ式で値を返すわけではありません(これは常に条件付きで返す必要はありません) "エラー"ステートメントを返します "暗黙的に型文字列をSystem.Threading.Tasks.Taskに変換できません" – AKS

+0

@AKS、それは私のために働いています。最初のエラーを修正するには、ロックブロックの後またはifブロックの後に戻り文字列が必要です。私は戻りコードstring.Empty私のコードです。私は一見することができるように、更新されたコードを貼り付けます。 – shr

+0

ありがとうshr、私はそれを誤って返す "エラー"と仮定した。内部ロックは関数RunMessageProcesから戻っていますが、実際はTask.Runへの戻り値でした。 var retValue =のような余分なコードと最後のコメント付きのチェックは、知識の扉を開きます。どうもありがとうございます。 – AKS

関連する問題