2

を使用して Azure Table Storage に非同期で書き込もうとしてBeginExecuteいますが、一貫性のない結果が得られています。に変更BeginExecuteするExecuteと、すべてが適切に書き込まれますが、メインスレッドがメッセージを送信する速度に応じて、スレッドが互いにキャンセルされているか、何かが間違っていると推測しています。これが私が今していることです:

TableOperation op = TableOperation.Insert(entity);
_table.BeginExecute(op, new AsyncCallback(onTableExecuteComplete), entity);

private void onTableExecuteComplete(IAsyncResult result)
{
    TableResult tr = _table.EndExecute(result);
    if ((tr.HttpStatusCode < 200) || (tr.HttpStatusCode > 202))
    {
        Console.WriteLine("Error writing to table.");
    }
}

いくつかのエントリでテストしていますが、テーブルに 1 つまたは 2 つのエントリが表示されますが、すべてではありません。エラーをキャッチし、すべてのエントリが適切に記述されていることを確認する方法についてのアイデアはありますか?

更新:Thread.Sleep(5000);メイン スレッドの最後に配置すると、すべての書き込みが終了することがわかりました。メインスレッドが終了する前に一時停止して、他のすべてのスレッドが終了していることを確認して、終了する前にキャンセルされないようにする方法はありますか?

4

1 に答える 1

2

おそらく、メイン スレッドが終了し、アクティブなすべての子スレッドが破棄されます。非同期プログラミングを行っている場合、メイン スレッドは、(サービスなどの) 完了を待機するのに十分な時間実行する必要があるか、非同期タスクが終了するのを待機する必要があります。

var result = _table.BeginExecute(op,
    new AsyncCallback(onTableExecuteComplete), entity);
result.AsyncWaitHandle.WaitOne();

ソース: http://msdn.microsoft.com/en-us/library/system.iasyncresult.aspx

もちろん、これには疑問があります。「非同期」タスクが完了するのを待っている間に他に何もする必要がない場合は、物事を単純にするために同期的に行うこともできます。非同期パターンの目的は、他のプロセスが終了するのを待っている間にブロックされるべきではないスレッドのためのものです - 複雑さが増します。

于 2013-04-05T17:44:14.063 に答える