Tag: task parallel library

在TPL Dataflow中,是否可以在创建块之后但在使用之前更改DataflowBlockOptions?

……让它生效吗? 我想推迟设置ExecutionDataflowBlockOptions.SingleProducerConstrained属性,直到我准备将网络链接在一起。 (因为,我想用它们的语义分开创建块,用它的语义将网络链接在一起。) 但据我所知,只能在创建块时设置ExecutionDataflowBlockOptions(例如,对于TransformBlock,TransformManyBlock等,您将其传递给构造函数,否则它不可见)。 但是……我没有注意到这些物业有公共制定者。 所以…我可以用ExecutionDataflowBlockOptions的占位符实例创建块并保持它以便以后我可以设置SingleProducerConstrained = true,如果我愿意,将块链接在一起(并且它将生效)? (顺便说一句,有没有什么方法可以判断SingleProducerConstrained除了测量吞吐量之外是否有任何影响?) 更新: @ i3amon在他的回答中正确指出这是无法完成的,因为数据流块会克隆您传入的DataflowBlockOptions并使用它。 但无论如何,我使用内部数据结构,我可以通过reflection和动态访问。 我把它放在下面的答案中。

具有取消支持的Task.Run

考虑一下这个Task.Run示例 。 它显示了如何创建具有取消支持的任务。 我正在做类似的事情: Task.Run(()=>{while (!token.IsCancellationRequested()) {…}}, token); 我的问题: 由于我已经有了对取消令牌的引用,为什么将它作为参数传递给Task.Run调用呢? 我经常在示例中看到以下代码: if (token.IsCancellationRequested) token.ThrowIfCancellationRequested(); 这段代码的目的是什么? 为什么不从方法return ?

如何在TPL数据流中安排流量控制?

我试图控制TPL Dataflow中的数据流。 我有一个非常快的制作人和一个非常慢的消费者。 (我的真实代码更复杂,但是,这是一个非常好的模型,它重现了问题。) 当我运行它时,代码开始饮用内存,就像它的样式一样 – 并且生产者的输出队列尽可能快地填满。 我真正希望看到的是制作人停止运行一段时间,直到消费者有机会要求它。 根据我对文档的阅读,这是应该发生的事情:也就是说,我认为生产者等待消费者有空间。 显然情况并非如此。 如何修复它以便队列不会发疯? using System; using System.Linq; using System.Threading.Tasks; using System.Threading.Tasks.Dataflow; using System.Threading; namespace MemoryLeakTestCase { class Program { static void Main(string[] args) { var CreateData = new TransformManyBlock(ignore => { return Enumerable.Range(0, 1000 * 1000 * 1000).Select((s,i) => “Hello, World ” + i); }); var ParseFile […]

请求取消令牌的任务事件或操作

这是我的代码: public sealed class ProcessingTask : ProcessingObject { private CancellationTokenSource _cancelToken; private int _timeOut = 10000; public int ProcessObjectID { get; private set; } public Task ProcessObjectTask { get; private set; } public QueueObject queueObject { private get; set; } public ProcessingTask(int processObjectID, Uri url) : base(url) { this.ProcessObjectID = processObjectID; } public void ResetTask() […]

自定义TaskScheduler,SynchronizationContext?

async等待演员内部的支持 我将演员lib Akka移植到.NET( https://github.com/rogeralsing/Pigeon )我想在我的演员中添加async / await支持。 这给了我一些问题,因为如果我使用默认调度程序,await continuation将运行与actor并发boundarys相关。 这意味着,当actor处理消息时,可以继续运行,因为这将导致两个线程同时访问actor内部状态。 如果我能以某种方式将任务安排到演员自己的邮箱,并在邮箱运行中完成任务,这将解决问题。 public class SomeActor : UntypedActor { protected override OnReceive(object message) { if (message is SomeMessage) { DoAsyncStuff(); } } private async void DoAsyncStuff() { var res = await something.. //this code will not respect the actor concurrency boundary //since it can run at the […]

获取任务的方法名称

我希望从C#中的任务中获取方法/操作名称。 具体来说,我正在实现一个自定义任务调度程序,并希望生成有关任务运行持续时间的统计信息,然后我将通过在任务内部运行的方法进行聚合。 在visual studio调试器中,您可以访问它并查看m_action私有变量以及调试器显示注释,并将其显示为Method = {0}。 有没有办法从任务本身访问这个?

易失性IEnlistmentNotification和TransactionScope.AsyncFlowEnabled = true

除了.NET 4.5.1之外,TransactionScope上还有一个新选项,可以使用异步流。 这允许编写以下客户端代码 using(var txt = new TransactionScope(…, TransactionScopeAsyncFlowOption.Enabled) { await sender.SendAsync(); } 到现在为止还挺好。 但是当我需要实现一个易变的IEnlistmentNotification时,我正在努力做到这一点。 让我们假设以下场景,假设:我的底层基础架构从下到上完全异步 public class MessageSender : ISendMessages { public async Task SendAsync(TransportMessage message, SendOptions options) { await sender.SendAsync(message); } } 所以我想要实现的是引入像这样的易失性IEnlistmentNotification: internal class SendResourceManager : IEnlistmentNotification { private readonly Func onCommit; public SendResourceManager(Func onCommit) { this.onCommit = onCommit; } public void […]

为什么TaskFactory.StartNew收到CancellationToken

可能重复: 任务构造函数中的取消令牌:为什么? 此方法接收CancellationToken: CancellationTokenSource cts = new CancellationTokenSource(4); var t = Task.Factory.StartNew(() => { // code }, cts.Token); 由于取消是合作的(实际工作代码需要观察取消令牌),将此作为参数传递给StartNew方法的目的是什么?

如何表示我的数据流完成?

我有一个类实现了一个使用TPL Dataflow由3个步骤组成的数据流。 在构造函数中,我将步骤创建为TransformBlocks并使用LinkTo将其链接起来,并将DataflowLinkOptions.PropagateCompletion设置为true。 该类公开了一个方法,通过在第一步调用SendAsync来启动工作流。 该方法返回工作流程最后一步的“完成”属性。 目前,工作流中的步骤似乎按预期执行,但最终步骤永远不会完成,除非我明确地在其上调用Complete。 但这样做会使工作流程短路并且没有执行任何步骤? 我究竟做错了什么? public class MessagePipeline { private TransformBlock step1; private TransformBlock step2; private TransformBlock step3; public MessagePipeline() { var linkOptions = new DataflowLinkOptions { PropagateCompletion = true }; step1 = new TransformBlock( x => { Console.WriteLine(“Step1…”); return x; }); step2 = new TransformBlock( x => { Console.WriteLine(“Step2…”); return x; […]

如何获取Task 并对其进行超时?

我的其他问题基本上需要这个,所以我想我会在这里分享我的通用解决方案。 我在HttpClient任务上遇到麻烦,因为Web请求基本上没有完成; 所以程序或线程挂起。 我需要一种简单的方法来为任务添加超时,以便正常返回或在超时首先到期时返回取消。 可以在这里找到一些替代方法: http : //blogs.msdn.com/b/pfxteam/archive/2011/11/10/10235834.aspx