C# 发布/消费:等待订阅、筛选消息和处置
使用Rx.NET3 通过使用Quartz.Net调度器,我构建了一个工作流管理器,将作业(在完成的作业上使用Quartz Joblistener)与嵌入式web服务器链接起来。 应用程序实例化一个主题实例(单例) web服务获取数据并启动工作流,注入唯一ID。此唯一ID通过工作流传播。 Joblistener委托检测特定作业的结束,并使用包含唯一ID和DB表ID的类型对注入的主题实例调用OnNext 其思想是,每次调用时,web服务都会订阅主题,等待传入的消息/事件,并根据唯一ID对其进行过滤。找到时,会处理订阅,收集生成的数据并将其返回给调用方 如何使我的Subscribe()等待传入的消息,过滤它们并进行Dispose(),而不过早地完成web服务。C# 发布/消费:等待订阅、筛选消息和处置,c#,.net,system.reactive,reactivex,C#,.net,System.reactive,Reactivex,使用Rx.NET3 通过使用Quartz.Net调度器,我构建了一个工作流管理器,将作业(在完成的作业上使用Quartz Joblistener)与嵌入式web服务器链接起来。 应用程序实例化一个主题实例(单例) web服务获取数据并启动工作流,注入唯一ID。此唯一ID通过工作流传播。 Joblistener委托检测特定作业的结束,并使用包含唯一ID和DB表ID的类型对注入的主题实例调用OnNext 其思想是,每次调用时,web服务都会订阅主题,等待传入的消息/事件,并根据唯一ID对其进行过滤。
//model
// 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)
公共类异步通信对象
{
公共字符串密钥{get;}
公共字符串值{get;}
公共异步通信对象(字符串键、字符串值)
{
钥匙=钥匙;
价值=价值;
}
}
//可注射单态
公共静态主题异步通信{get;set;}=new Subject();
//在web服务中
System.Threading.EventWaitHandle waitHandle=new System.Threading.AutoResetEvent(false);
string yourID=some ID
变量订阅=\u异步通信(已注入)
.Where(x=>x.Key==yourID)
.采取(1)
.订阅(
x=>
{
dbId=x.值;
waitHandle.Set();
}
);
_schedulerCore.ExecuteJob(upload.JobId,jobDataMap);
waitHandle.WaitOne();
waitHandle.Reset();
subscription.Dispose();
//在职监听器
_OnNext(新的AsyncCommunicationObject(您的ID,一些值)
您不需要手动处理订阅。
任何边界运算符,如Take
或First
都会发出OnCompleted
信号,从而导致序列被处理。您还可以使用wait
observates来避免写回调
比如说,,
dbId=await AsyncCommunication.FirstAsync(x=>x.Key==id)
您需要向我们展示我们的代码。没有它,我们无法回答此问题。您需要一个.thx来提供一些内部行为。尽管我会有并发问题。我需要订阅,调用作业计划程序并等待事件。当首先调用作业计划程序时,使用FirstAsync()时,我可能会错过事件。