2017-05-28 7 views
0

次のようにして他の意見を探すより良い方法があるように感じます。値を返すタスクをラップする

本質的に、私はasync/awaitパターンを利用しようとしていますが、これを達成するためにTaskでTaskをラップする方法で何が起きたのかを示すためにメソッドからbool値を返す必要があります。私のスパイシーセンスは、実装に何か問題があると私に伝えています。

以下の例では、「LongRunningTask」は、タスクを返すライブラリメソッドであるため、何も変更できないため、制御できません。フローロジックの残りの部分を変更することができます。明らかに、これは私の実際の問題の架空の表現ですが、問題を示すためのものです。ハードコードされた "GetData"などに巻き込まれないようにしてください。

私は他のオプションを知っています。

void Main() 
{ 
    StartApplication(); 
} 

private async void StartApplication() 
{ 
    // This is a just fictional example passing hard-coded GetData 
    var didExecuteLongRunningTask = await ProcessStuff("GetData"); 

    if (didExecuteLongRunningTask) 
    { 
     Console.WriteLine("Long running task was executed"); 
    } 
    else { 
     Console.WriteLine("Long running task was NOT executed"); 
    } 
} 

// Define other methods and classes here 
private async Task<bool> ProcessStuff(string command) 
{ 
    if (command == "GetData") 
    { 
     await LongRunningTask(); 
     return await Task<bool>.Factory.StartNew(() => true); 
    } 
    else 
    { 
     return await Task<bool>.Factory.StartNew(() => false); 
    } 
} 

private Task LongRunningTask() 
{ 
    return Task.Delay(2000); 
} 
+3

'async'はちょうど' trueを返します; 'や' falseを返す; ' –

答えて

2

はい、正しく、あなたはそれを複雑にしています。あなただけ行うことができます。

private async Task<bool> ProcessStuff(string command) 
{ 
    if (command == "GetData") 
    { 
     await LongRunningTask(); 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

あなたはより多くの情報については、MSDNを見ることができます:あなたの関数がマークされているAsynchronous Programming

+0

うわー、[OK] ...私は戻ってブールが魔法のようにタスクに変換されることを私が気づいていないので、私はそれを試みていない。どのように動作するのか調べる必要があります。 –

+0

@JoshuaMason MSDNのリンクからすべての基本を得ることができます。 –

+0

ありがとう、私は実際にはかなりの時間async/awaitパターンを使用していましたが、何とかこれを見逃しました完全に。この記事では、実際にこの特定の側面の魔法をかなりうまく説明しています。 https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/async-return-types –

関連する問題