我在ServiceStack& amp; Redis,但是我在线程中被ThreadPool和Pub / Sub搞糊涂了,而且在消息回调中访问Redis的明显限制。我得到的实际错误表明我只能打电话给#34;订阅"或者"发布"在"当前背景下#34;当我尝试从消息回调中执行另一个Redis操作时会发生这种情况。
我有一个必须持续运行的流程。在我的情况下,我不能只为一次请求服务,但必须始终保持线程处于活动状态(并且从REST API路由控制这些线程是理想的)。数据必须定期进入流程,并且必须发布数据。该过程还必须存储和检索Redis中的数据。我正在使用路由和服务来获取数据并将其存储在Redis中,因此必须从"计算"中进行异步。处理。我认为pub / sub将是将各个部分粘合在一起的答案,但到目前为止似乎并不可能。
以下是我的代码当前的结构(具有上述错误的代码)。这是开始长期"计算"的路线的回调。螺纹:
public object Get(SystemCmd request)
{
object ctx = new object();
TradingSystemCmd SystemCmd = new TradingSystemCmd(request, ctx);
ThreadPool.QueueUserWorkItem(x =>
{
SystemCmd.signalEngine();
});
return (retVal); // retVal defined elsewhere
}
这是SystemCmd.signalEngine():
public void signalEngine(){
using (var subscription = Redis.CreateSubscription())
{
subscription.OnSubscribe = channel =>
{
};
subscription.OnUnSubscribe = channel =>
{
};
subscription.OnMessage = (channel, msg) =>
{
TC_CalcBar(channel, redisTrade);
};
subscription.SubscribeToChannels(dmx_key); //blocking
}
}
" TC_CalcBar" call会在数据可用时对数据进行处理。在此调用中,调用Redis进行常规数据库访问(以及错误)。我可以做的是删除订阅并使用另一种方法来阻止Redis中可用的数据。但目前的做法似乎很不错,直到它失败了。 : - )
我也不知道ThreadPool是否与错误有关。
答案 0 :(得分:2)
根据Redis文档:
一旦客户端进入订阅状态,就不应该这样做 发出任何其他命令,除了额外的SUBSCRIBE,PSUBSCRIBE, UNSUBSCRIBE和PUNSUBSCRIBE命令。