jjzjj

task-parallel-library

全部标签

c# - Task.Delay().Wait() 是怎么回事?

我很困惑,为什么Task.Delay().Wait()需要4倍的时间,然后是Thread.Sleep()?例如task-00是否在仅线程9上运行并花费了2193毫秒?我知道,同步等待在任务中很糟糕,因为整个线程都被阻塞了。仅供测试。控制台应用程序中的简单测试:boolflag=true;varsw=Stopwatch.StartNew();for(inti=0;i{Console.WriteLine($"task-{cntr.ToString("00")}\tThrID:{Thread.CurrentThread.ManagedThreadId.ToString("00")},\tWa

c# - 使用 Parallel.ForEach 时跟踪进度

我正在重构我的程序以使用Parallel.ForEach。之前,当我使用常规for循环时,我使用Dispatcher更新WPF进度条,通过将当前数组索引除以数组大小来显示完成百分比。对于并行的foreach循环,这不会正确显示,即%随机跳跃,这是预期的。如何为每个循环更新并行的WPF进度条,以便跟踪已完成的迭代次数? 最佳答案 正如SLaks所建议的,您应该只增加进度条值,而不是将其设置为您从Parallel.For方法获得的当前索引。但是,我会认真考虑使用一些比在每次迭代时向UI线程发送消息更便宜的方法。如果您有大量迭代,那么每次

c# - 如何安排有条件的 ContinueWith

我在一堆LINQ查询上有一些GUI。查询需要一些时间来执行,所以我希望GUI能够响应并显示繁忙指示器和进度条。许多查询是为了检查数据中存在的某些条件。如果查询返回空结果,应用程序应继续下一个查询。如果它返回结果,则返回集的严重性将是“警告”或“错误”。如果是警告,则继续执行。如果出错,则停止。许多代码与线程池和GUI玩“乒乓球”。准代码:TaskFactory.StartNew(()=>{Runinbackground}.ContinueInGui(()=>{Updatesomething}).ContinueInBackground(()=>{Domorework;}).Contin

c# - 从 Task.WhenAll 获取结果

我有多个任务返回我想使用Task.WhenAll(new[]{t1,t2,t3});调用的相同对象类型并阅读结果。当我尝试使用Task>all=awaitTask.WhenAll(newTask[]{t,t2}).ConfigureAwait(false);编译错误Cannotimplicitlyconverttype'void'to'System.Threading.Tasks.Task>两个任务都在调用类似于this的方法。privateTask>GetFiles(stringpath){files=newList();returnTask.Run(()=>{//removefor

c# - 如何在 .NET ConcurrentDictionary 中实现 remove_if 功能

我有一个场景,我必须为ConcurrentDictionary中的给定键保留引用计数对象,如果引用计数达到0,我想删除该键。这必须是线程安全的,因此我计划使用ConcurrentDictionary。示例程序如下。在并发字典中,我有key和value,值是KeyValuePair,它保存我的自定义对象和引用计数。ConcurrentDictionary>ccd=newConcurrentDictionary>();//followingcodeaddsthekey,ifnotexistswithreference//countformycustomobjectto1//ifthekey

c# - Task.Factory.FromAsync 和 BeginX/EndX 之间的区别?

在使用来自TcpClient的标准BeginRead和EndRead方法以及使用Task.Factory.FromAsync时,我有非常相似的代码。这里有一些例子..错误处理代码没有显示。Task.Factory.FromAsync:privatevoidRead(Statestate){Taskread=Task.Factory.FromAsync(state.Stream.BeginRead,state.Stream.EndRead,state.Bytes,state.BytesRead,state.Bytes.Length-state.BytesRead,state,TaskCr

c# - Parallel.ForEach 错误行为

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:C#ValuestorageduringParallelProcessing今天我在我的控制台应用程序中运行一些性能测试,我偶然发现了一些非常出乎意料的事情。我的代码:intiterations=1000000;varmainList=newList();for(inti=0;i();Parallel.ForEach(mainList,(listItem)=>{if(Int32.Parse(listItem)%2==0){listA.Add(listItem);}});Console.WriteLine("P

c# - 使用 Parallel.ForEach() 的 yield return 的线程安全

考虑以下代码示例,它创建一个可枚举的整数集合并并行处理它:usingSystem.Collections.Generic;usingSystem.Threading.Tasks;publicclassProgram{publicstaticvoidMain(){Parallel.ForEach(CreateItems(100),item=>ProcessItem(item));}privatestaticIEnumerableCreateItems(intcount){for(inti=0;i是否保证Parallel.ForEach()生成的工作线程每个都获得不同的项目,或者是否需要一

c# - 为什么 Task.WaitAll() 不会在此处阻塞或导致死锁?

在下面的示例中,使用了两个await调用。为了获得性能,样本被转换为Task.WaitAll()(实际上并没有更快,但这只是一个例子)。这是在Android上使用Sqlite.Net的库中的代码,该方法是从主UI线程上的OnResume()调用的:publicasyncTaskSetupDatabaseAsync(){awaitCreateTableAsync();awaitCreateTableAsync();}这是替代方案:publicvoidSetupDatabaseAsync(){vart1=CreateTableAsync();vart2=CreateTableAsync()

c# - 调用 API 时在哪里使用并发

在一个C#项目中,我正在对WebAPI进行一些调用,问题是我在一个方法的循环中执行它们。通常没有那么多,但即使我在考虑利用并行性。目前我正在尝试的是publicvoidDeployView(intitemId,stringitemCode,intenvironmentTypeId){using(varclient=newHttpClient()){client.BaseAddress=newUri(ConfigurationManager.AppSettings["ApiUrl"]);client.DefaultRequestHeaders.Accept.Clear();client.