我已经实现了一个 SqlListener 类,它使用 SqlDependency 来等待 SQL 数据库的变化。在我的业务工作流程中,我需要等待数据库中出现一条记录。当找到请求的记录时,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;
}