Questions tagged «task-parallel-library»

自.NET 4开始,任务并行库是.NET Framework的一部分。它是一组API,使开发人员可以对异步应用程序进行编程。

3
如何创建运行STA线程的任务(TPL)?
使用线程非常简单 Thread thread = new Thread(MethodWhichRequiresSTA); thread.SetApartmentState(ApartmentState.STA); 如何在WPF应用程序中使用“任务”完成相同任务?这是一些代码: Task.Factory.StartNew ( () => {return "some Text";} ) .ContinueWith(r => AddControlsToGrid(r.Result)); 我收到一个InvalidOperationException与 调用线程必须是STA,因为许多UI组件都需要STA。

4
从非异步代码调用异步方法
我正在更新具有.NET 3.5中内置的API表面的库。结果,所有方法都是同步的。我无法更改API(即,将返回值转换为Task),因为这将要求所有调用者都进行更改。因此,我剩下如何以同步方式最好地调用异步方法了。这是在ASP.NET 4,ASP.NET Core和.NET / .NET Core控制台应用程序的上下文中。 我可能还不够清楚-这种情况是我有不支持异步的现有代码,并且我想使用仅支持异步方法的新库,例如System.Net.Http和AWS开发工具包。因此,我需要弥合差距,并能够拥有可以被同步调用但可以在其他地方调用异步方法的代码。 我已经读了很多书,而且有很多次被问及回答了。 从非异步方法调用异步方法 同步等待异步操作,为什么Wait()在这里冻结程序 从同步方法中调用异步方法 如何同步运行异步Task <T>方法? 同步调用异步方法 如何在C#中从同步方法调用异步方法? 问题是大多数答案都不一样!我见过的最常见的方法是使用.Result,但这会导致死锁。我已经尝试了以下所有方法,并且它们都能正常工作,但是我不确定哪种方法可以避免死锁,具有良好的性能并且可以在运行时很好地发挥作用(在尊重任务调度程序,任务创建选项等方面) )。有明确的答案吗?最好的方法是什么? private static T taskSyncRunner<T>(Func<Task<T>> task) { T result; // approach 1 result = Task.Run(async () => await task()).ConfigureAwait(false).GetAwaiter().GetResult(); // approach 2 result = Task.Run(task).ConfigureAwait(false).GetAwaiter().GetResult(); // approach 3 result = task().ConfigureAwait(false).GetAwaiter().GetResult(); // approach …

4
使用C#在.NET 4.0中替代Task.Run的方法是什么?
我得到了这个程序,该程序给我语法错误“ System.Threading.Tasks.task不包含运行的定义”。 我正在使用VB 2010 .NET 4.0有什么想法?在.net 4.0中运行是否有替代品? using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ChatApp { class ChatProg { static void Main(string[] args) { Task<int> wakeUp = DoWorkAsync(2000,"Waking up"); Task.WaitAll(wakeUp); } static Task<int> DoWorkAsync(int milliseconds, string name) { //error appears below on word Run …

4
无法将类型'string'隐式转换为'System.Threading.Tasks.Task <string>'
我是异步编程的新手,因此在研究了一些异步示例代码之后,我想到了编写一个简单的异步代码 我创建了一个简单的Winform应用程序,并在Form内编写了以下代码。但是它只是不起作用 private Task&lt;string&gt; methodAsync() { Thread.Sleep(10000); return "Hello"; //Error: Cannot implicitly convert type 'string' to 'System.Threading.Tasks.Task&lt;string&gt;' } private async void button1_Click(object sender, EventArgs e) { string s = await methodAsync(); MessageBox.Show(s); } 有人可以在这里放点光..

5
在C#中并行运行三种方法的最简单方法
我使用三种方法进行一些数字运算,如下所示 results.LeftFront.CalcAi(); results.RightFront.CalcAi(); results.RearSuspension.CalcAi(geom, vehDef.Geometry.LTa.TaStiffness, vehDef.Geometry.RTa.TaStiffness); 每个函数彼此独立,并且可以在没有死锁的情况下并行计算。 没有完成包含方法直到所有三个方法都完成时,并行计算这些方法的最简单方法是什么?

2
TPL与异步/等待(线程处理)之间的区别
试图了解TPL&async/await与线程创建之间的区别。 我相信TPL(TaskFactory.StartNew)的工作方式ThreadPool.QueueUserWorkItem与之类似,因为它使线程池中的线程上的工作排队。当然,除非您使用TaskCreationOptions.LongRunning它创建一个新线程。 我认为async/await本质上将类似地工作: TPL: Factory.StartNew( () =&gt; DoSomeAsyncWork() ) .ContinueWith( (antecedent) =&gt; { DoSomeWorkAfter(); },TaskScheduler.FromCurrentSynchronizationContext()); Async/ Await: await DoSomeAsyncWork(); DoSomeWorkAfter(); 将是相同的。从我一直在阅读的内容来看,似乎async/ await“有时”创建了一个新线程。那么,何时创建新线程,何时不创建新线程?如果您正在处理IO完成端口,我可以看到它不必创建新线程,但否则我认为必须这样做。我想我对FromCurrentSynchronizationContext永远的理解也有些模糊。从本质上讲,我始终认为它是UI线程。


4
如果使用可枚举的大对象,Parallel.ForEach可能会导致“内存不足”异常
我正在尝试将数据库中存储了图像的数据库迁移到数据库中指向硬盘驱动器上文件的记录。我试图使用这种方法来Parallel.ForEach加快查询速度,以查询出数据。 但是,我注意到我遇到了OutOfMemory异常。我知道Parallel.ForEach将查询一批可枚举的对象,以减少开销(如果有一个用于将查询间隔开)(因此,如果您一次执行一堆查询而不是将它们间隔开,那么您的源将更有可能将下一条记录缓存在内存中出来)。问题是由于我返回的记录之一是一个1-4Mb字节数组,缓存导致整个地址空间用完(该程序必须以x86模式运行,因为目标平台将是32位机) 有什么方法可以禁用缓存或使TPL的缓存更小吗? 这是显示问题的示例程序。这必须在x86模式下进行编译,以显示问题,如果它花费很长时间或在您的计算机上没有发生,则增大了阵列的大小(我发现1 &lt;&lt; 20在我的计算机上花费了大约30秒的时间,并且4 &lt;&lt; 20几乎是瞬时的) class Program { static void Main(string[] args) { Parallel.ForEach(CreateData(), (data) =&gt; { data[0] = 1; }); } static IEnumerable&lt;byte[]&gt; CreateData() { while (true) { yield return new byte[1 &lt;&lt; 20]; //1Mb array } } }

2
Reactive Framework,PLINQ,TPL和并行扩展如何相互关联?
至少自.NET 4.0发布以来,Microsoft似乎在支持并行和异步编程上付出了很多努力,并且似乎已经出现了许多与此相关的API和库。特别是最近到处都经常提到以下奇特的名字: 反应框架 PLINQ(平行LINQ), TPL(任务并行库)和 并行扩展。 现在它们似乎都是Microsoft产品,它们似乎都针对.NET的异步或并行编程方案。但是,目前还不清楚它们实际上是什么以及它们之间如何相互联系。有些可能实际上是同一回事。 简而言之,任何人都可以直接确定什么是记录吗?

3
为什么要继续执行Task.WhenAll的延续?
Task.WhenAll在.NET Core 3.0上运行时,我只是对该方法感到好奇。我将一个简单Task.Delay任务作为单个参数传递给Task.WhenAll,并且希望包装后的任务的行为与原始任务相同。但这种情况并非如此。原始任务的延续是异步执行的(这是理想的),多个Task.WhenAll(task)包装的延续是一个接一个地同步执行的(这是不希望的)。 这是此行为的演示。四个辅助任务正在等待同一Task.Delay任务完成,然后继续进行大量的计算(由模拟Thread.Sleep)。 var task = Task.Delay(500); var workers = Enumerable.Range(1, 4).Select(async x =&gt; { Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}" + $" [{Thread.CurrentThread.ManagedThreadId}] Worker{x} before await"); await task; //await Task.WhenAll(task); Console.WriteLine($"{DateTime.Now:HH:mm:ss.fff}" + $" [{Thread.CurrentThread.ManagedThreadId}] Worker{x} after await"); Thread.Sleep(1000); // Simulate some heavy CPU-bound computation }).ToArray(); Task.WaitAll(workers); 这是输出。四个延续在不同线程(并行)中按预期运行。 05:23:25.511 [1] Worker1 before await 05:23:25.542 …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.