使用Rx.Net 3
通过使用Quartz.Net Scheduler,我构建了一个工作流管理器,用于将作业(使用完成作业的Quartz Joblistener)与嵌入式Web服务器链接起来。 应用程序实例化Subject(单例)的实例。
Web服务获取数据并启动工作流,注入唯一ID。此唯一ID通过工作流传播。 Joblistener委托检测特定作业的结束,并在注入的Subject实例上调用OnNext,其中Type包含唯一ID和DB表ID。
这个想法是每次调用的Web服务都订阅了Subject并等待传入的消息/事件,并在唯一ID上过滤它们。当找到处理订阅时,收集并将生成的数据返回给调用者。
如何让我的Subscribe()等待收到的消息,过滤它们和Dispose(),而不会过早地完成Web服务。
答案 0 :(得分:0)
// model
public class AsyncCommunicationObject
{
public string Key { get; }
public string Value { get; }
public AsyncCommunicationObject(string key, string value)
{
Key = key;
Value = value;
}
}
// injectable singleton
public static Subject<AsyncCommunicationObject> AsyncCommunication { get; set; } = new Subject<AsyncCommunicationObject>();
// in web service
System.Threading.EventWaitHandle waitHandle = new System.Threading.AutoResetEvent(false);
string yourID = some ID
var subscription = _asyncCommunication (injected)
.Where(x => x.Key == yourID)
.Take(1)
.Subscribe(
x =>
{
dbId = x.Value;
waitHandle.Set();
}
);
_schedulerCore.ExecuteJob(upload.JobId, jobDataMap);
waitHandle.WaitOne();
waitHandle.Reset();
subscription.Dispose();
// in job listener
_asyncCommunication.OnNext(new AsyncCommunicationObject(your ID, some value)
答案 1 :(得分:0)
您无需手动处理订阅。
任何边界运算符(如Take
或First
信号OnCompleted
都会导致序列被丢弃。您还可以使用await
observables来避免编写回调。
例如,
dbId = await AsyncCommunication.FirstAsync(x => x.Key == id)