c# - 在事件再次触发之前等待事件完成

标签 c# asynchronous async-await

我有以下场景,我有一个事件不断接收需要推送到数据库的 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/

相关文章:

c# - 单元测试添加/获取方法对

c# - 如何在 DropDownList 中保留空格 - ASP.net MVC Razor View

c# - 如何摆脱 .Net C# 中的 ffmpeg.exe 黑色终端?

ios - 使用dispatch_group_async从嵌套异步调用获取通知

c# - 路径字符串中的子字符串

ios - 异步下载 - 右模式

javascript - indexeddb 游标中的异步操作

c# - 为什么 Task.WhenAll() 阻塞在这里?

javascript - 在异步循环后写入控制台

node.js - es6-promise:httpntlm 模块中的 promisify