我有以下场景,我有一个事件不断接收需要推送到数据库的 xml,推送代码和事件如下所示:
async void signalrClient_OnXMLReceived(object value, MessageResponseEventArgs e)
{
await SaveXML();
}
async task SaveXML(string xmlDoc)
{
await SaveCustomer(GetCustomerDataFrmXML(xmlDoc));
await SavePlantInfo(GetPlantDataFrmXML(xmlDoc))
if(NotJobexists(GetJob(xmlDoc))
{
await SaveJob(GetJobInfo(xmlDoc))
}
}
问题是,一旦我在 save 方法中遇到第一个等待,控制权就会被带回到接收新 xml 并再次调用 save 的事件,所以我的问题是,如何确保我执行再次触发事件之前 save 方法中的所有代码。
当事件被调用时,我无法控制该事件,但是当它调用时,我想确保在下次调用该事件之前完全处理该事件,我该怎么做?
更新:谢谢大家的回复,我想在事件再次触发之前完全处理该事件的原因是,如果我再得到一个与事件中第一个类似的 xml,我实际上是插入了两个由于异步性质,这将导致数据库中出现重复条目,最后我重新排序了我的保存,并在几个等待保存方法之前检查是否存在重复项。这解决了这个问题。我没有尝试队列或 Recative 框架建议,因为这需要快速修复。
最佳答案
“..我想确保在下次调用该事件之前完全处理该事件,我该怎么做?”
根本不要使方法异步应该满足您的要求。
关于c# - 在事件再次触发之前等待事件完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22478269/