2017-07-13 20 views
-1

私は私のC#コードでasyncawaitを使用する新たなんです。私はちょうど自分自身が...非同期バージョンと同じ、何も返さない非同期待機関数ですか?

class Database 
{ 
    DatabaseConnection connection; 

    async void Close() 
    { 
    await connection.CloseAsync(); 
    } 
} 

を次のような機能を書いた。しかし、単に以下を使用するなど、その鉱山のClose方法は同じです...

void Close() 
{ 
    connection.Close(); 
} 

それともありより良い非同期バージョンの基本的な改善?もちろん

+0

CloseAsyncは別のタスクでクロージングロジックを実行し、(必要に応じ)あなたは可能なことを待ちます。閉じると、現在のスレッドから時間がかかります。 – tym32167

+1

特に 'async void'の使用については、[this](https://msdn.microsoft.com/en-us/magazine/jj991977.aspx)をお読みください。 –

答えて

1

は、彼らは同じではありません!

この方法では何も返されないので、完了するのを待つ必要はありません。

真実ですが、すべての非同期メソッドは、値を返すかどうかにかかわらず、同期メソッドです。例えば

connection.Close(); 
Console.WriteLine("Closed"); 

Closeが同期しています。 「クローズド」は、クローズが完了した後にのみ印刷されます。あなたがここにCloseAsyncを使用する場合は、「クローズ」それはCloseAsyncawait声明に達した後、すぐに印刷され、閉鎖動作は非同期で実行を開始します。つまり、「閉じる」が印刷されると、クローズ操作がまだ完了していない可能性があります。

また、GUIを使用している場合は、メインスレッド上でCloseを呼び出すと、UIが同期するため、UIがフリーズします。値を返すかどうかにかかわらず、操作はまだ時間がかかりますか?

は今、違いを参照してください?

関連する問題