小编Mat*_*olf的帖子

TPL Dataflow,Post()和SendAsync()之间的功能区别是什么?

我对通过Post()或SendAsync()发送项目之间的区别感到困惑.我的理解是,在所有情况下,一旦项目到达数据块的输入缓冲区,控制权将返回到调用上下文,对吗?那为什么我需要SendAsync?如果我的假设不正确,那么我想,相反,如果使用数据块的整个想法是建立并发和异步环境,为什么有人会使用Post().

我当然理解技术上的差异,Post()返回一个bool,而SendAsync返回一个等待bool的任务.但是它有什么影响呢?何时返回bool(我理解是否确认该项是否放在数据块的队列中)会被延迟?我理解async/await并发框架的一般概念,但在这里并没有多大意义,因为除了bool之外,对传入项所做的任何操作的结果都不会返回给调用者,而是放在一个"out-queue"并转发到链接数据块或丢弃.

发送项目时两种方法之间是否存在性能差异?

c# concurrency message-passing task-parallel-library tpl-dataflow

46
推荐指数
2
解决办法
9511
查看次数

TPL Dataflow仅在完成所有源数据块时保证完成

两个完成转换后,如何重新编写代码完成的代码?我认为完成意味着它被标记为完成并且"出队列"是空的?

public Test()
    {
        broadCastBlock = new BroadcastBlock<int>(i =>
            {
                return i;
            });

        transformBlock1 = new TransformBlock<int, string>(i =>
            {
                Console.WriteLine("1 input count: " + transformBlock1.InputCount);
                Thread.Sleep(50);
                return ("1_" + i);
            });

        transformBlock2 = new TransformBlock<int, string>(i =>
            {
                Console.WriteLine("2 input count: " + transformBlock1.InputCount);
                Thread.Sleep(20);
                return ("2_" + i);
            });

        processorBlock = new ActionBlock<string>(i =>
            {
                Console.WriteLine(i);
            });

        //Linking
        broadCastBlock.LinkTo(transformBlock1, new DataflowLinkOptions { PropagateCompletion = true });
        broadCastBlock.LinkTo(transformBlock2, new DataflowLinkOptions { PropagateCompletion = true });
        transformBlock1.LinkTo(processorBlock, new DataflowLinkOptions { …
Run Code Online (Sandbox Code Playgroud)

c# concurrency task-parallel-library tpl-dataflow

23
推荐指数
3
解决办法
1万
查看次数

TPL Dataflow,如何将项目转发到许多链接目标块中的一个特定目标块?

我正在寻找一个TPL数据流块解决方案,它可以容纳多个项目,可以链接到多个目标块,但是它能够将项目转发到仅通过过滤器/谓词的特定目标块.在任何时候都不应该将项目同时传递到多个目标块,始终只能传递给与过滤器匹配的项目,或者可以丢弃该项目.我不喜欢BroadCastBlock,因为如果我理解正确,它不能保证传送(或者是吗?)并且过滤是在目标块侧完成的,这意味着BroadCastBlock基本上将每个项目的副本发送到所有linkedTo目标块.如果我理解正确,它也不会在任何时候持有多个项目.我不想使用Post/Async但维护LinkTo链.

有没有办法绕过完整的自定义数据流块?或者我误解了BroadCastBlock的工作原理?不幸的是,实际上没有太多文档可以详细介绍并涵盖用例.任何想法都受到高度赞赏.

c# message-passing task-parallel-library actor tpl-dataflow

20
推荐指数
2
解决办法
5403
查看次数

无法远程桌面进入Windows Azure VM

我正在运行Windows Azure试用版并设置一个简单的Windows虚拟机.但是,我似乎无法使用Windows远程桌面连接远程进入机器.我究竟做错了什么?乍一看它似乎不喜欢我的用户名和密码.但后来我也无法ping通VM地址.我不想通过VS或任何其他工具,我喜欢通过Windows RMD工具进行简单的远程桌面连接.

windows remote-desktop virtual-machine azure

19
推荐指数
1
解决办法
4万
查看次数

任务与TPL数据流与异步/等待,何时使用?

我已阅读了许多技术文档,其中包括一些Microsoft团队或其他作者详细介绍了新TPL Dataflow库的功能,async/await并发框架和TPL.但是,我并没有真正遇到任何明确描述使用时间的内容.我知道每个都有自己的位置和适用性,但我特别想知道以下情况:

我有一个完全在进程中运行的数据流模型.在顶部是数据生成组件(A),它生成数据并通过数据流块链接或通过将事件提升到处理组件(B)来传递数据.(B)中的某些部分必须同步运行,而(A)大量受益于并行性,因为大多数进程是I/O或CPU绑定的(从磁盘读取二进制数据,然后对它们进行反序列化和排序).最后,处理组件(B)将转换后的结果传递给(C)以供进一步使用.

我特别想知道何时使用任务,async/await和TPL数据流块以下内容:

  • 启动数据生成组件(A).我显然不想锁定gui /仪表板,因此这个过程必须在某个不同的线程/任务上运行.

  • 如何在(A),(B)和(C)中调用不直接参与数据生成和处理过程但执行可能需要几百毫秒/秒返回的配置工作的方法.我的预感是,这是async/await闪耀的地方?

  • 我最挣扎的是如何最好地设计从一个组件传递到下一个组件的消息.TPL Dataflow看起来非常有趣,但有时候我的目的太慢了.(最后请注意性能问题).如果不使用TPL Dataflow,如何通过进程间任务/并发数据传递实现响应性和并发性?例如,如果我在一个任务中引发一个事件,订阅的事件处理程序在同一个任务中运行而不是传递给另一个任务,那么对吗?总之,组件(A)在将数据传递给组件(B)之后如何进行业务,而组件(B)检索数据并专注于处理数据?这里最好使用哪种并发模型?我在这里实现了数据流块,但这真的是最好的方法吗?

  • 我想总结上面的要点是我在如何使用标准实践设计和实现API类型组件方面的努力?方法是否应设计为异步,数据输入为数据流块,数据输出为数据流块还是事件?一般来说最好的方法是什么?我问,因为上面提到的大多数组件都应该独立工作,因此它们基本上可以在内部交换或独立更改,而无需重新编写访问器和输出.

关于性能的注意事项:我提到TPL Dataflow块有时很慢.我处理高吞吐量,低延迟类型的应用程序和目标磁盘I/O限制,因此tpl数据流块通常比例如同步处理单元执行得慢得多.问题是我不知道如何将进程嵌入到自己的任务或并发模型中,以实现与tpl数据流块已经处理的类似的东西,但没有tpl df带来的开销.

task-parallel-library async-await tpl-dataflow

11
推荐指数
1
解决办法
3636
查看次数

为什么IEumerator <T>会影响IEnumerable <T>的状态,即使枚举器从未到达终点?

我很好奇为什么以下内容在"最后"赋值时抛出错误消息(文本阅读器关闭异常):

IEnumerable<string> textRows = File.ReadLines(sourceTextFileName);
IEnumerator<string> textEnumerator = textRows.GetEnumerator();

string first = textRows.First();
string last = textRows.Last();
Run Code Online (Sandbox Code Playgroud)

但是以下执行正常:

IEnumerable<string> textRows = File.ReadLines(sourceTextFileName);

string first = textRows.First();
string last = textRows.Last();

IEnumerator<string> textEnumerator = textRows.GetEnumerator();
Run Code Online (Sandbox Code Playgroud)

不同行为的原因是什么?

c# ienumerable ienumerator textreader

11
推荐指数
1
解决办法
242
查看次数

Protobuf-net序列化/反序列化

我查了但似乎无法看到如何将类直接序列化为字节数组,然后使用Marc Gravell的protobuf-net实现从字节数组反序列化.

编辑:我改变了问题并提供了代码,因为原始问题如何序列化为byte []而不必通过流是无足轻重的.我很抱歉.

更新的问题:有没有办法不必处理泛型,而是在通过构造函数传递时通过反射推断属性"MessageBody"的类型?我假设我无法序列化对象类型,对吗?当前的解决方案看起来非常麻烦,因为每次实例化一个新消息时我都需要传递MessageBody的类型.有更简洁的解决方案吗?

我想出了以下内容:

class Program
{
    static void Main(string[] args)
    {
        Message<string> msg = new Message<string>("Producer", "Consumer", "Test Message");

        byte[] byteArray = msg.Serialize();
        Message<string> message = Message<string>.Deserialize(byteArray);

        Console.WriteLine("Output");
        Console.WriteLine(message.From);
        Console.WriteLine(message.To);
        Console.WriteLine(message.MessageBody);

        Console.ReadLine();

    }
}

[ProtoContract]
public class Message<T>
{
    [ProtoMember(1)]
    public string From { get; private set; }
    [ProtoMember(2)]
    public string To { get; private set; }
    [ProtoMember(3)]
    public T MessageBody { get; private set; }

    public Message()
    {

    }

    public Message(string from, string to, T messageBody) …
Run Code Online (Sandbox Code Playgroud)

c# serialization bytearray protocol-buffers protobuf-net

10
推荐指数
2
解决办法
3万
查看次数

这是TPL Dataflow的工作吗?

我在不同的任务上运行一个非常典型的生产者/消费者模型

Task1:从二进制文件中读取一批byte [],并为每个字节数组集合启动一个新任务.(该操作是为了内存管理目的而批量处理的).

任务2-n:这些是工作任务,每个都在字节数组的传入集合(来自Tasks1)上运行,并对字节数组进行反序列化,按特定条件对它们进行排序,然后存储结果对象的集合(每个字节数组)在"并发字典"中反序列化为此类对象.

任务(n + 1)我选择了并发字典,因为此任务的工作是以与它们来自Task1的顺序相同的顺序合并存储在并发字典中的那些集合.我通过传递一个collectionID(它是int类型并为Task1中的每个新集合递增)从Task1到此任务一直向下实现.此任务基本上检查下一个预期的collectionID是否已存储在并发字典中,如果是,则将其取出,将其添加到Final Queue并检查并发字典中的下一个集合.

现在,从我所看到的和我观看的视频看来,TPL Dataflow可能是这种生产者/消费者模型的完美候选者.我似乎无法设计并因此开始,因为我从未使用过TPL Dataflow.在吞吐量和延迟方面,这个库甚至可以完成任务吗?我目前处理250万字节数组,因此在生成的集合中每秒处理对象.TPL Dataflow可以帮助简化吗?我对以下问题的答案特别感兴趣:TPL Dataflow可以在产生工作任务时保留Task1中的集合批次的顺序,并在工作任务完成后重新合并它们吗?它是否优化了什么?在对整个结构进行分析之后,我觉得由于旋转和涉及太多并发集合而浪费了相当多的时间.

任何想法,想法?

c# concurrency producer-consumer task-parallel-library tpl-dataflow

10
推荐指数
1
解决办法
2352
查看次数

Protobuf-Net错误消息:没有为类型定义Serializer:System.Type

我在尝试序列化时收到以下错误消息List<Tuple<string, Type, object>>:没有为类型定义Serializer:System.Type

我尝试了两种方法,只是序列化上面的集合或序列化一个具有定义为protoMember的相同集合的类.两者都会导致相同的错误消息.

这是不受支持的类型吗?我认为它是受支持的,我忽略了别的东西,但也许我不正确?

感谢任何可能有助于解决此问题的指针......

c# protocol-buffers system.type protobuf-net

10
推荐指数
1
解决办法
7027
查看次数

需要的数据库建议 - > Columnar,Embedded(如果可能)

编辑:作为答案的结果到目前为止,我希望在我喜欢的内容中添加更多关注点:允许在内存中编写的数据库(可能是简单的C#代码),并且存储选项具有持久性以便访问数据从R. Redis到目前为止看起来最有希望.我还考虑实际使用类似于Lockfree ++或ZeroMQ的东西,以避免将数据同时写入数据库,而是通过消息总线/其他实现将所有数据发送到持久化数据,并让一个"actor"处理所有写操作内存数据库或其他解决方案.除了Redis之外还有更多的想法(有些人提到了SQLite,我还需要测试它的性能).还有其他建议吗?

我正在寻找满足我下面大部分要求的理想数据库结构/解决方案,但到目前为止我完全失败了.你能帮忙吗?

我的任务:我在.Net 4.5(C#)中运行一个进程并生成(通常)我希望在其他应用程序中进行进一步分析的值类型,因此要么保留内存,要么保留在磁盘上.更多下面.数据在不同的任务/线程内生成,因此基于行的数据格式不能很好地匹配这种情况(因为在不同的线程中生成的数据是在不同的时间生成的,因此不对齐).因此我认为柱状数据结构可能是合适的,但如果我错了,请纠正我.

例:

任务/线程#1在给定时间戳处生成以下数据

datetime.ticks /输出数据的值

1000000001 233.23

1000000002 233.34

1000000006 234.23 ......

Taks/Thread#2在给定时间戳处生成以下数据

datetime.ticks /输出数据的值

1000000002 33.32

1000000005 34.34

1000000015 54.32 ......

我不需要在.Net运行时对齐时间戳,我首先保留数据并在稍后处理R或Python中的数据.

我的要求:

  • 快速写入,快速写入,快速写入:可能发生的情况是,我每秒生成100,000到1,000,000个数据点,需要保持(最坏情况)或保留在内存中的数据.可以在自己的线程上运行写入,因此这个过程可能会滞后于数据生成过程,但限制是16gb RAM(64位代码),更多低​​于此.

  • 首选是柱状数据库格式,因为它很适合我以后想要查询数据的方式,但如果它对上面的例子有意义,我可以接受任何其他结构(如果所有其他要求,文档/键值也可以.满足,特别是在写入速度方面).

  • 可以从.Net中引用的API.示例:HDF5可能被一些人认为是有能力的,但我发现他们的.Net端口很糟糕.支持.Net好一点的东西会有好处但是如果满足所有其他要求那么我可以处理类似于HDF5 .Net端口的东西.

  • 如果可能的话,并发写:如前所述,我喜欢从不同的任务/线程同时写入数据.

  • 我受到16GB内存的约束(在64位运行.Net进程),因此我可能会寻找一些不纯粹在内存中的东西,因为我有时会产生更多的数据.内存中有时会持续存在或纯粹的持久性模型可能更可取.

  • 嵌入式的优先级,但如果客户端/服务器解决方案中的服务器可以作为Windows服务运行,那么没有问题.

  • 在数据访问方面,我非常喜欢已经存在R和Python接口的数据库解决方案,因为我喜欢在Python中使用Panda库进行时间序列对齐和其他分析并在R中运行分析.

  • 如果API /库支持SQL/SQL-like/Linq/like查询,那将是非常好的但通常我只需要绝对的简单骨骼,例如在开始和结束日期之间加载柱状数据(给定"key"/ index是这样的格式)因为我在R/Python中分析和运行查询.

  • 如果它带有管理控制台或数据可视化工具,那将是一个加号但不是必须的.

  • 应该是开源的或者在"达到"范围内定价(不,KDB在这方面没有资格;-)

好的,这是我到目前为止所拥有的,而且我得到的全部是因为大多数数据库解决方案在写入性能要求上已经失败了:

  • Infobright和Db4o.我喜欢我到目前为止阅读的内容,但我承认我没有检查任何性能统计数据
  • 我自己完成的事情.我可以轻松地以二进制格式存储值类型并通过datetime.ticks索引数据,我只需要以某种方式编写脚本来加载/反序列化Python/R中的数据.但如果我想添加并发,查询引擎和其他好东西,那将是一项艰巨的任务.因此,我寻找已经存在的东西.

c# sql database api concurrency

9
推荐指数
2
解决办法
2098
查看次数