2016-07-02 5 views
0

私はasychメソッドとして宣言しているメソッドがあります。コードは以下の通りです。ビジュアルスタジオのエラー/非同期構文に関する提案

private async Task<string> tempPassword() 
{ 
    char[] hashes = "[email protected]$#".ToCharArray(); 
    Random r = new Random(DateTime.Now.Millisecond); 
    List<char> bits = new List<char>(); 
    while (bits.Count < 7) 
    { 
     int i = r.Next(0, hashes.Length); 
     if (!bits.Contains(hashes[i])) 
       bits.Add(hashes[i]); 
    } 
    return string.Join("", bits.ToArray()); 
} 

このコードが正しいとコンパイルですが、Visual Studioは私に次のようなフィードバックを与える:

この非同期メソッドは待つ演算子を欠いており、synchroniously実行されます。 await演算子を使用してノンブロッキングAPIコールを待機するか、 'await Task.Run(...)'を使用して、バックグラウンドスレッドでCPUバウンド処理を行うことを検討してください。

私は非同期的な背景を持っていませんが(正直言ってそれを使用しているので、私は学びます)、この方法では何もないようです私はそれが私が待っているはずであるものであるかどうかについて少し厄介です。

+4

コードにasyncはありません。そのため、非同期としてマークするべきではありません。それはコンパイラがあなたに伝えようとしているものです。署名を 'private string tempPassword()'に変更するだけです。 –

答えて

1

その場合のawait演算子

が必要となり、この方法で何かがあるように、それは私には思えない、なぜこの方法asyncは、最初の場所にありますか? awaitを使用する場合は、asyncが必要です。現在の状態では、メソッドは同期的に実行され、すでに完了したTask<string>を返します。非同期にする必要がないと思われる場合は、署名を変更してstringを返すだけです。将来非同期になることが予想される場合(または、インターフェイスを実装しているか、または基本クラスのメソッドをオーバーライドしているために戻り値の型を変更できない場合)、修飾子asyncを削除して明示的に完了したタスク:

return Task.FromResult(string.Join("", bits.ToArray())); 

これにより、非同期状態マシンを作成するオーバーヘッドを回避できます。

関連する問題