SqlDependency を使用して SQL データベースの変更を待機する SqlListener クラスを実装しました。ビジネス ワークフローのある時点で、データベースにレコードが表示されるのを待つ必要があります。SqlListener は、要求されたレコードが見つかったときにイベントをトリガーします。これはうまくいきます。While ループに入り、イベントが返されるのを検出するまで待機することで機能させることができます。しかし、これは理想的な設計ではありません。それはプロセッサを無駄に回転させます。
もっと賢く開催を待ちたいと思います。Task、NotificationDelegate、ManualResetEvent などの使用に関する多くの提案を読みましたが、すべてをまとめることはできませんでした。
単純化された例は、おそらく理解を容易にするでしょう。これが私の現在のセットアップです。しかし、可能であれば、い while ループを取り除きたいです。
private const int MaxWaitTime = 5;
private SqlListener<RecordType> _recordListener;
private RecordType _record;
/// <summary>
/// Request a record and wait until it is found.
/// </summary>
public RecordType GetRecordAwait(int requestedId)
{
// Initiate listening for record
_recordListener = new SqlListener<RecordType>();
_recordListener.SqlModified += SqlListener_SqlModified;
_recordListener.StartListening(requestedId);
// Wait until record is found
var startTime = DateTime.Now;
while (_record == null &&
DateTime.Now.Subtract(startTime).TotalSeconds < MaxWaitTime)
{
Thread.Sleep(1);
}
// Stop listening
_recordListener.SqlModified -= SqlListener_SqlModified;
_recordListener.Dispose();
_recordListener = null;
// Return record
return _record;
}
private void SqlListener_SqlModified(object sender, SqlModifiedArgs args)
{
_record = (RecordType)args.Record;
}