3

私は非同期操作の専門家ではなく、誰かが問題を指摘するのを手伝ってくれることを望んでいます。

私のメソッドの 1 つで、ラッパーを作成しました。

public static async Task<int> ExecuteNonQueryRawSQLAsync(string sqlStatement)
{
    int _returnValue = -1;
    using (SqlConnection _conn = new SqlConnection("connectionString"))
    {
        using (SqlCommand _comm = new SqlCommand())
        {
            _comm.Connection = _conn;
            _comm.CommandText = sqlStatement;
            _comm.CommandType = CommandType.Text;

            // other codes on setting parameter

            try
            {
                await _conn.OpenAsync();
                _returnValue = Convert.ToInt32(await _comm.ExecuteNonQueryAsync());
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
    return _returnValue;
}

私のUIでは、このようにメソッドを呼び出します。

int _recordsAffected = await MyClass.ExecuteNonQueryRawSQLAsync("INSERT....");

本当に機能しているかどうかをテストするために、接続文字列に無効なデータベース サーバー アドレスを指定して、例外がスローされるまで検索を続けようとしました。

プログラムがまだ接続している間、UI がフリーズします。ラッパーに欠けているものは何ですか? または、他に必要な初期化が必要ですか?

4

2 に答える 2

5

苦い記憶から、TCP ソケットには非常によく似た問題があります。基本的に、名前解決は、非同期操作であっても同期的に実行されます。これには 2 つの方法があります。

  • 名前の代わりに IP アドレスを使用する
  • Open*//必ずワーカー スレッドから開始してConnect*ください-おそらくTask.StartNew

テストされていませんが、おそらく:

await Task.StartNew(_conn.Open);
于 2013-10-08T08:33:06.393 に答える