2017-11-14 10 views
0

私は以下のコードを理解すると、最終的に他のコードを実行している間に文字列classificationを取得する必要があります。私はawait classification上のエラーを取得するしかし私のasync/awaitについての理解は正しいですか?

[HttpPost] 
public async Task<ActionResult> CreatePropertyAsync(Property property) 
{ 
    string classification = GetClassification(property); 
    // GetClassification() runs a complex calculation but we don't need 
    // the result right away so the code can do other things here related to property 

    // ... code removed for brevity 

    property.ClassificationCode = await classification; 
    // all other code has been completed and we now need the classification 

    db.Properties.Add(property); 
    db.SaveChanges(); 
    return RedirectToAction("Details", new { id = property.UPRN }); 
} 

public string GetClassification(Property property) 
{ 
    // do complex calculation 
    return classification; 
} 

これはMatthew Jones' article

public async Task<string> GetNameAndContent() 
{ 
    var nameTask = GetLongRunningName(); //This method is asynchronous 
    var content = GetContent(); //This method is synchronous 
    var name = await nameTask; 
    return name + ": " + content; 
} 

から以下のコードと同じように動作するはずです:「string」は「GetAwaiter」

の定義が含まれていません。

なぜこれが起こっているのか分かりません。

はまた、私が代わりに使用する必要があり、高価な計算のためのMSDN docsに従って:

property.ClassificationCode = await Task.Run(() => GetClassification(property)); 

を、これは実際に私が欲しいものを達成することや、これはとにかく同期動作していますか?

ご協力いただきありがとうございます。

+2

とを読んでいますhttps://stackoverflow.com/q/47285836/23354 –

+0

MSDNページはASP.NETに関するものではありません。 –

+2

async/awatに関するあなたの理解は間違っていますが、より真剣にSe​​rver側のプログラミングについてのあなたの理解にも欠陥があります。非同期I/Oの場合は、待機中のチェーンに追加します。 CPUバインドされた作業については、何もしないでください。それは正しいですか?https://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx –

答えて

7
string classification = GetClassification(property); 

これは通常の同期コードです。 classificationが割り当てられるまで何もしません。 GetClassificationAsyncが途中で本当に非同期何かを行い、最終的にTask<string>を移入

Task<string> classification = GetClassificationAsync(property); 

:何がしたいことはあるように聞こえます。 GetClassificationAsyncが同期して動作する場合、コードはすべて同期し続けることに注意してください。特に、Task.FromResultを使って自分自身を見つけた場合は、おそらく何もしていないでしょうasync

+2

'GetClassification'の戻り値の型はどうでしょうか?あなたは 'GetClassificationAsync'を意味するならば' ' – Shyju

+2

@Shyjuでなければなりません。それでは、それは確かに –

+2

でなければなりません。GetClassificationがCPUバインドだけであれば、非同期にしてはいけません。実行=> https://blog.stephencleary.com/2013/11/taskrun-etiquette-examples-even-in.html –

0

あなたは

[HttpPost] 
public async Task<ActionResult> CreatePropertyAsync(Property property) 
{ 
    Task<string> classificationTask = Task.Run(() => GetClassification(property)); 
    // GetClassification() runs a complex calculation but we don't need 
    // the result right away so the code can do other things here related to property 

    // ... code removed for brevity 

    property.ClassificationCode = await classificationTask; 
    // all other code has been completed and we now need the classification 

    db.Properties.Add(property); 
    db.SaveChanges(); 
    return RedirectToAction("Details", new { id = property.UPRN }); 
} 

public string GetClassification(Property property) 
{ 
    // do complex calculation 
    return classification; 
} 

にコードを変更する必要がマシュー・ジョーンズからのコードと同じを持っている。しかし、ちょっと似た質問数時間前からhttps://blog.stephencleary.com/2013/11/taskrun-etiquette-examples-dont-use.htmlなぜASP.NET

関連する問題