自.NET 4以来,任务并行库是.NET Framework的一部分。它是一组API,使开发人员能够对异步应用程序进行编程。
Mutex.TryOpenExisting() 是线程安全的吗?
我使用Mutex.TryOpenExisting()。我想知道线程安全吗? 公共类 MutexNamedSystemDemo { 私有 const string _mutexName = @"Global\{C7F2DE44-8927-4B01-B8E1-D8F158A483A8}"...
他们说任务很好,因为它们是非阻塞的。这就说得通了。一段时间以来,我们有了异步的一切——mvc 中的异步操作、异步 Web api 调用、异步 ef 方法等。 第一个...
我该如何做与TaskCompletionSource<nothing>等效的事情?
我想要一个类似 EventWaitHandle 的任务,我在一端等待它,然后将其设置为在另一端完成。 TaskCompletionSource 几乎是我想要的,但它需要我传递一个
我在“任务”中使用了“锁定”,它不起作用并且发生了竞争条件 我定义了一个 Counter,它最终应该返回 0,因为 Method 会增加 C 的值...
Parallel.ForEach 与 ActionBlock
对于给定的 MaxDegreeOfParallelism 和需要处理的固定数量的对象(即在它们上执行某些代码),Parallel.ForEach 和 ActionBlock 似乎是相同的
所以我有一个包含 900 多个 C# 条目的列表。对于列表中的每个条目,都必须执行一个方法,尽管这些方法必须同时执行。首先我想到这样做: 公共无效初始化T...
当在工作线程上调用的方法需要在 UI 线程上运行代码并等待其完成后再执行其他操作时,可以这样做: 公共 int RunOnUi(Func&...
我想在后台线程中运行一个函数,然后在异步上下文中超时使用结果。 这是我的代码: 打开系统.线程.任务 让永远() = 虽然是真的 ...
从 API 获取数据时,C# Parallel.ForEach 循环中的员工详细信息变为 null
我在 C# 中使用并行 foreach 循环从 API 获取员工详细信息时遇到了问题。请注意,我已使用并发包来执行任务,以使其线程安全并添加它......
我有一个工作计时器,它每分钟检查是否有事情要做。如果有事情要做,计时器停止,任务开始(startTimer),这主要需要几分钟,然后...
在C# asp.net实体框架中创建多个数据库连接以并行方式获取数据
我有一个场景,我必须从数据库中获取 18000 条记录,并将其转换为 DTO。 refId 总数 = 数据库中引用表的 18000 个唯一 ID。 int 批量大小 = 1000;...
为什么Task内部需要使用ManualResetEventSlim?
根据Task的源码https://source.dot.net/#System.Private.CoreLib/src/libraries/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs,1483 所以任务使用 ManualResetEventSlim ke...
我已经读了2个小时了,但我仍然很困惑。有人说使用StartNew,有人说Task.Run,有人说别的。我确实知道 Task.Run 给了我一个编译错误。 我需要开始
我有一个消费者,一个使用与此类似的 BlockingCollection 的自定义后台工作者 公共类 PCQueue:IDisposable { BlockingCollection _taskQ = 新的 BlockingCollection 我有一个消费者,一个自定义后台工作人员,使用 BlockingCollection 类似于 this public class PCQueue : IDisposable { BlockingCollection<Action> _taskQ = new BlockingCollection<Action>(); public PCQueue () { Task.Factory.StartNew (Consume); } public void Dispose() { _taskQ.CompleteAdding(); } public TaskCompletionSource<t> EnqueueTask<T>(Func<T> action) { var completion = new TaskCompletionSource<T>(); _taskQ.Add (() => completion.TrySetResult(action())); return completion; // Perhaps task needs to be returned here } void Consume() { foreach (Action action in _taskQ.GetConsumingEnumerable()) action(); } } 问题在于,如果不等待任务,则阻塞收集不会继续执行队列中的下一个任务。换句话说,“即发即忘”功能不起作用。在下面的代码中,第二个调用被困在队列中,直到等待下一个调用。 public static async Task Main() { // This will print "Start" var originalScheduler = InstanceService<ScheduleService>.Instance; await originalScheduler.Send(() => Console.WriteLine("Start")).Task; // If not awaited, this will not print anything originalScheduler.Send(() => Console.WriteLine("Continue")); // This will print the last two messages, "Continue" and "Complete" await originalScheduler.Send(() => Console.WriteLine("Complete")).Task; } 问题 现在工作人员允许等待排队的任务或取消工作。如何确保即使没有等待,任务也会以“即发即忘”的方式执行? 对于可能关注的人,更新了实施。 问题似乎是TaskCreationSource永远不会完成,因此当执行这些命令时,任务队列将陷入等待第一个任务的状态。 var s = InstanceService<ScheduleService>.Instance; await s.Send(() => Console.WriteLine("Start")).Task; // 1st task starts but doesn't complete s.Send(() => Console.WriteLine("Continue")); // await s.Send(() => Console.WriteLine("Complete")).Task; // This completes the 1st task 解决方案是使用选项 TaskCompletionSource 创建 TaskCreationOptions.RunContinuationsAsynchronously,因此原来安排工作的方法将更改为此。 TaskCompletionSource<T> EnqueueTask<T>(Func<T> action) { var options = TaskCreationOptions.RunContinuationsAsynchronously; var completion = new TaskCompletionSource<T>(options); _taskQ.Add (() => completion.TrySetResult(action())); return completion; // completion.Task.Start() is not needed }
Thread.Sleep() 与 Task.Delay().Wait()
异步方法中的代码库是这样的: 线程.睡眠(500); 一位同事将其重构为这样: 任务.延迟(500).等待(); 鉴于相对较小的延迟,使用...
如何使用Task通过计数器运行BackgroundService?
我的 dot net core 应用程序中有一个后台服务。这将通过容量计数器运行。 公共类 WebWorkGenerator :BackgroundService { 私有 const int ConsumeCapacityPerMinute = 1...
将 CancellationToken 与异步方法的任务相关联
问题:有没有办法将 CancellationToken 与从异步方法返回的任务关联起来? 一般来说,如果抛出OperationCancelledException,任务将最终处于取消状态...
Task.IsCanceled 的文档指定OperationCanceledException.CancellationToken 必须与用于启动任务的取消标记匹配才能正确确认。我和...
假设端点A有一个Subject,端点B有一个IObservable。 端点 A 使用 OnNext() 发送 T 的一个对象,并且从不调用 OnComplete()。我没有缺点...
使用预定义对象减少 Task.Run/Factory.StartNew 中的闭包开销
这纯粹是为了实验目的和/或学习练习。本质上,我想看看是否可以减少使用 Task.Run(()=>Func<>()) 时创建的闭包的占用空间