【发布时间】:2026-01-17 18:45:01
【问题描述】:
是否可以等待来自事件聚合器(例如 prism)的回调?
MessageManager.Subscribe("Reply", this.GetType().Name, Myfunc);
private void Myfunc(object obj)
{
}
public async void MyFunc2()
{
MessageManager.Publish("Request", xxx);
await [Message Reply]
}
在 lambda 中有一个丑陋的订阅方法,然后是取消订阅,但这不是很漂亮。
有更好的方法吗?
编辑:
这是我目前的解决方案:
private SemaphoreSlim dataReady = new SemaphoreSlim(0, 1);
MeasurementDataSet lastDataSet;
public Calibrator(IMessageManager msgMgr)
{
MessageManager = msgMgr;
MessageManager.Subscribe("NewMeasurementData", this.GetType().Name, OnMeasurementData);
}
private void OnMeasurementData(object obj)
{
lastDataSet = (MeasurementDataSet) obj;
dataReady.Release();
}
public async void Calibrate(IParameterCache prmCache, Action<string> updateText)
{
MessageManager.Publish("InitiateMeasurement", "CAL ");
await dataReady.WaitAsync();
// do stuff
MessageManager.Publish("InitiateMeasurement", "CAL ");
await dataReady.WaitAsync();
// do stuff
MessageManager.Publish("InitiateMeasurement", "CAL ");
await dataReady.WaitAsync();
// do stuff
}
【问题讨论】:
-
Prism 几乎不是“消息总线”
-
事件聚合器
-
await [Message Reply]是什么意思?是在等待MyFunc中发生的事情吗? -
async-await可能不是这里的最佳选择。它从不用于事件流。 -
问题是它在后台控制一台硬件机器,并且必须经过特定的过程,因此使用await async比到处都有回调要容易得多。 @PauloMorgado
标签: c# callback async-await messaging