Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 发布/消费:等待订阅、筛选消息和处置_C#_.net_System.reactive_Reactivex - Fatal编程技术网

C# 发布/消费:等待订阅、筛选消息和处置

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对其进行过滤。

使用Rx.NET3

通过使用Quartz.Net调度器,我构建了一个工作流管理器,将作业(在完成的作业上使用Quartz Joblistener)与嵌入式web服务器链接起来。 应用程序实例化一个主题实例(单例)

web服务获取数据并启动工作流,注入唯一ID。此唯一ID通过工作流传播。 Joblistener委托检测特定作业的结束,并使用包含唯一ID和DB表ID的类型对注入的主题实例调用OnNext

其思想是,每次调用时,web服务都会订阅主题,等待传入的消息/事件,并根据唯一ID对其进行过滤。找到时,会处理订阅,收集生成的数据并将其返回给调用方

如何使我的Subscribe()等待传入的消息,过滤它们并进行Dispose(),而不过早地完成web服务。

//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()时,我可能会错过事件。