![](/img/trans.png)
[英]Name scope issues due to binding to event that gets fired before template layout
[英]Awaiting an event to complete before it gets fired again
我有以下情况,我有一个继续接收需要推送到数据库的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框架建议,因为这需要快速解决。
“ ..我想确保在下次调用该事件之前能完全处理该事件,我该怎么办?”
根本不要使方法完全符合您的要求。
Microsoft的Reactive Framework将为您很好地处理此问题。
您可以从事件中创建一个可观察对象,而不必以常规方式处理事件:
var xmlreceiveds =
Observable.FromEventPattern<EventHandler<MessageResponseEventArgs>>(
h => signalrClient.OnXMLReceived += h,
h => signalrClient.OnXMLReceived -= h);
现在,您可以获得源源不断的事件,这些事件一定会在下一个事件发生之前完成。
您可以这样处理:
var xmlreceiveds =
Observable
.FromEventPattern<EventHandler<MessageResponseEventArgs>>(
h => signalrClient.OnXMLReceived += h,
h => signalrClient.OnXMLReceived -= h);
xmlreceiveds.Subscribe(ep =>
{
SaveCustomer(GetCustomerDataFrmXML(ep.EventArgs.XmlDoc));
SavePlantInfo(GetPlantDataFrmXML(ep.EventArgs.XmlDoc));
if (NotJobexists(GetJob(ep.EventArgs.XmlDoc)))
{
SaveJob(GetJobInfo(ep.EventArgs.XmlDoc));
}
});
通过包括一个ObserveOn
方法调用,可以轻松地在另一个线程上处理此问题,如下所示:
var xmlreceiveds =
Observable
.FromEventPattern<EventHandler<MessageResponseEventArgs>>(
h => signalrClient.OnXMLReceived += h,
h => signalrClient.OnXMLReceived -= h)
.ObserveOn(Scheduler.Default);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.