我尝试通过将它包装在BlockingCollection中来实现ConcurrentDictionary,但似乎没有成功.
据我所知,一个变量声明BlockingCollection如工作ConcurrentBag<T>,ConcurrentQueue<T>等等.
因此,要创建一个包含在BlockingCollection中的ConcurrentBag,我会声明并实例化如下:
BlockingCollection<int> bag = new BlockingCollection<int>(new ConcurrentBag<int>());
Run Code Online (Sandbox Code Playgroud)
但如何为ConcurrentDictionary做到这一点?我需要生产者和消费者方面的BlockingCollection的阻止功能.
我按以下方式配置我的文档存储:
store = new DocumentStore { Url = serverUrl };
store.Initialize();
Run Code Online (Sandbox Code Playgroud)
我想知道如何确保先前或后期初始化但在打开会话之前是否客户端连接到服务器.我没有启动服务器,我仍然可以初始化存储,不知道为什么或者它是否默认创建嵌入式数据库,如果它无法在指定的URL下找到服务器.知道如何检查客户端和服务器之间是否建立了连接?
Quickfix/n 1.4 中提取此处定义的消息类型的最有效方法是什么:http : //www.fixprotocol.org/FIXimate3.0/en/FIX.5.0SP2/messages_sorted_by_type.html
我目前使用var msgType = Message.GetMsgType(message.ToString());结果为“A”的登录消息。有没有更好的办法?我尝试确定其中的消息类型ToAdmin(...)以捕获传出的登录请求消息,以便我可以添加用户名和密码。
我很想通过 MessageCracker 来做到这一点,但到目前为止,我还没有找到一种方法来实现捕获所有剩余消息类型,以防我没有实现所有 OnMessage 重载。(请参阅相关问题:Quickfix,是否有“全能”方法 OnMessage 来处理未由重载方法处理的传入消息?)。
谢谢
在 VS Code 中的 Jupyter Notebook 中,当我运行在某些时候打印大量输出的代码时,剩余的输出被抑制并显示一条消息
“显示更多(在文本编辑器中打开原始输出数据)......”
如何使所有输出可见?
我面临以下问题:
我有一个Foo对象数据流,并将这些对象流式传输到几个并发的进程内任务/线程,这些任务/线程依次处理对象和输出FooResult对象。每个都FooResult包含在其他成员中与Foo在创建FooResult. 但是,并非每个人都Foo必须创建一个FooResult.
我的问题是,我想从整个过程传递一个包装对象,该对象包含原始对象Foo和可能FooResult从Foo并发任务中创建的所有对象(如果有)。
注意:我目前使用 TPL 数据流,而每个并发进程都发生在ActionBlock<Foo>从BroadCastBlock<Foo>. 它使用SendAsync()目标数据流块来发送可能创建的FooResult. 显然,并发数据流块FooResult在不可预测的时间产生,这正是我目前所面临的问题。我似乎无法弄清楚FooResult总共创建了多少个,ActionBlock<Foo>以便我可以将它们与原始Foo对象捆绑在一起并将其作为包装对象传递。
在伪代码中,它目前如下所示:
BroadCastBlock<Foo> broadCastBlock;
ActionBlock<Foo> aBlock1;
ActionBlock<Foo> aBlock2;
ActionBlock<FooResult> targetBlock;
broadCastBlock.LinkTo(aBlock1); broadCastBlock.LinkTo(aBlock2);
aBlock1 = new ActionBlock<Foo>(foo =>
{
//do something here. Sometimes create a FooResult. If then
targetBlock.SendAsync(fooResult);
});
//similar for aBlock2
Run Code Online (Sandbox Code Playgroud)
但是,当前代码的问题在于,如果在任何操作块中都Foo没有生成单个,则 targetBlock …
鉴于以下情况:
BufferBlock<int> sourceBlock = new BufferBlock<int>();
TransformBlock<int, int> targetBlock = new TransformBlock<int, int>(element =>
{
return element * 2;
});
sourceBlock.LinkTo(targetBlock, new DataflowLinkOptions { PropagateCompletion = true });
//feed some elements into the buffer block
for(int i = 1; i <= 1000000; i++)
{
sourceBlock.SendAsync(i);
}
sourceBlock.Complete();
targetBlock.Completion.ContinueWith(_ =>
{
//notify completion of the target block
});
Run Code Online (Sandbox Code Playgroud)
在targetBlock似乎永远不会完成,我想原因是,在所有的项目TransformBlock targetBlock在输出队列中等待,因为我还没有链接的targetBlock其他任何数据流块。但是,我真正想要实现的是当(A)targetBlock通知完成和(B)输入队列为空时的通知。我不想关心项目是否仍然位于TransformBlock. 我该怎么办?是让我想查询的完成状态什么的唯一方式sourceBlock,并确保了InputCount的targetBlock是零?我不确定这是否非常稳定(sourceBlock如果中的最后一项sourceBlock已传递给 …
c# concurrency message-passing task-parallel-library tpl-dataflow
我寻找 JoinBlock 的替代方案,它可以通过 n-TransformBlocks 链接,并将所有 TransformBlock 源块的消息连接/合并在一起,以便将此类的集合传递给另一个数据流块。
JoinBlock 可以很好地完成工作,但仅限于连接 3 个源块。它还存在许多效率低下的问题(连接 2 个源块的偶数值类型(整数)非常慢)。有没有办法让任务从 TransformBlocks 返回并等到所有 TransformBlocks 都有一个完成的任务才能接受Task<item>?
任何替代想法?我可能有 1-20 个这样的转换块,在传递连接的项目集合之前,我需要将哪些项目连接在一起。每个转换块都保证为每个“转换”的输入项准确返回一个输出项。
编辑:要求澄清:
根据我之前的一个问题,我按如下方式设置了我的 JoinBlock:
public Test()
{
broadCastBlock = new BroadcastBlock<int>(i =>
{
return i;
});
transformBlock1 = new TransformBlock<int, int>(i =>
{
return i;
});
transformBlock2 = new TransformBlock<int, int>(i =>
{
return i;
});
joinBlock = new JoinBlock<int, int>();
processorBlock = new ActionBlock<Tuple<int, int>>(tuple =>
{
//Console.WriteLine("tfb1: " + tuple.Item1 + "tfb2: " + tuple.Item2);
});
//Linking …Run Code Online (Sandbox Code Playgroud) c# concurrency actor-model task-parallel-library tpl-dataflow
我想知道是否可以更改数据块的完成状态?
例如,我标记了一个var block = new BufferBlock<int>();完整的数据块block.Complete().该块链接到其他数据块.我想知道我是否可以block通过将其完成状态更改回原来的完整状态来再次运行.
如果不可能,我怎么能执行多次运行,包括完成,而不必a)解除所有块的链接,b)重新实例化所有块,c)再次重新链接所有块?
任何可以简化运行数据流周期任务的想法,包括完成链中的每个块而不必重新创建整个框架?
谢谢
我遇到的派生类有问题Service,这是ServiceStack库的一部分.如果我设置一个单独的类派生Service并放置Get或其中的Any方法然后一切运行正常,但问题是该类本身没有引用任何业务逻辑.只要我返回静态数据就可以了,但是如果我想将它集成到业务逻辑中那么那就行不通了.我希望Get方法成为我的业务逻辑所在的同一个类的一部分.这是不好的设计,如果我可以做些什么来解决它?我得到的错误是派生的类Service因为任何原因而被实例化(根据我目前的理解对我来说没什么意义).这个类来源Service,不仅仅是解决路由逻辑吗?
这里有一些代码来说明我的问题:
这段代码运行正常,但问题是类DTO对类的内容一无所知ClassWithBusinessLogic:
public class ClassWithBusinessLogic
{
public ClassWithBusinessLogic()
{
string hostAddress = "http://localhost:1337/";
WebServiceHost host = new WebServiceHost("MattHost", new List<Assembly>() { typeof(DTOs).Assembly });
host.StartWebService(hostAddress);
Console.WriteLine("Host started listening....");
Console.ReadKey();
}
}
public class HelloWorldRequest : IReturn<string>
{
public string FirstWord { get; set; }
public HelloWorldRequest(string firstWord)
{
FirstWord = firstWord;
}
}
public class DTO : Service
{
public string Get(HelloWorldRequest request)
{ …Run Code Online (Sandbox Code Playgroud) 我将DateDateTime 的部分作为查找值,并且喜欢在类型字典中检索匹配值Dictionary<DateTime, double>.请注意,DateTime键仅存储为Date部分.
我的问题是可能没有与我的查找值匹配的密钥.那么,什么我想要做的是找到最近的前面 dateTime.Date键和匹配值.
现在,我知道词典没有按键排序.我可以使用SortedDictionary,但更喜欢使用Dictionary来解决特定原因,或者切换到List集合(可以预先排序).我的问题是,在这种情况下你会建议做什么:在找到匹配的密钥之前保留Dictionary结构并减少查找值会更有效吗?或者使用列表集合并使用Linq会更好吗?每个词典包含大约5000个键/值对.此外,请注意我寻找一个计算效率高的解决方案,因为查找的频率非常高(可能数十万次(每次查找保证与以前的任何值不同)
c# ×9
concurrency ×4
tpl-dataflow ×4
actor-model ×1
collections ×1
datetime ×1
dictionary ×1
fix-protocol ×1
host ×1
http ×1
json ×1
linq ×1
merge ×1
python ×1
quickfix ×1
ravendb ×1
ravendb-http ×1
servicestack ×1