至less从.NET 4.0发布以来,微软似乎已经付出了很多的努力来支持并行和asynchronous编程,并且围绕这一点出现了许多API和库似乎。 特别是最近到处都有人提到下面这些奇特的名字: react native框架, PLINQ(并行LINQ), TPL(任务并行库)和 并行扩展。 现在,他们似乎都是微软的产品,他们似乎都针对.NET的asynchronous或并行编程scheme。 但是,他们究竟是什么以及他们是如何相互关联的还不太清楚。 有些可能实际上是相同的东西。 简而言之,任何人都可以直接logging什么是什么?
我一直在试图得到一些我认为会很简单的.NET 4.5的工作 我想同时解决两个长时间运行的任务并收集 导致最好的C#4.5(RTM)方式 下面的作品,但我不喜欢它,因为: 我希望Sleep是一个asynchronous的方法,所以它可以await其他方法 它看起来笨拙与Task.Run() 我不认为这是甚至使用任何新的语言function! 工作代码: public static void Go() { Console.WriteLine("Starting"); var task1 = Task.Run(() => Sleep(5000)); var task2 = Task.Run(() => Sleep(3000)); int totalSlept = task1.Result + task2.Result; Console.WriteLine("Slept for a total of " + totalSlept + " ms"); } private static int Sleep(int ms) { Console.WriteLine("Sleeping for " + […]
在.NET 4.5中有Task.Delay 我怎样才能在.NET 4.0中做到这一点?
我真的很喜欢这个问题: 在C#中最简单的方法来做一个消防和遗忘的方法? 我只是想知道,现在我们有在C#4.0中的并行扩展是否有一个更好的更干净的方式来执行Fire&Forget with parallel linq?
有人可以解释,如果await和ContinueWith是同义或不在下面的例子。 我正在尝试第一次使用TPL,并一直在阅读所有的文档,但不明白其中的差别。 等待 : String webText = await getWebPage(uri); await parseData(webText); 继续 : Task<String> webText = new Task<String>(() => getWebPage(uri)); Task continue = webText.ContinueWith((task) => parseData(task.Result)); webText.Start(); continue.Wait(); 在特定的情况下比其他人更喜欢吗?
在我的一个项目中,这是一个聚合器,我从网上parsing源,播客等等。 如果我使用顺序方法,考虑到大量资源,处理所有资源需要相当长的时间(由于networking问题和类似的东西); foreach(feed in feeds) { read_from_web(feed) parse(feed) } 所以我想要实现并发性,并不能决定是否应该基本上使用ThreadPools来处理工作线程或只是依靠TPL来进行sorting。 ThreadPools肯定会用工作线程来处理我的工作,我会得到我所期望的(在多核CPU环境下,其他核心也将被使用)。 但是我仍然想考虑TPL,因为它是推荐方法,但我有点担心。 首先我知道TPL使用ThreadPools,但增加了额外的决策层。 我主要关心的是单核环境存在的情况。 如果我没有错,TPL从一开始就有一个数字的工作线程开始,等于可用CPU内核的数量。 我害怕TPL在序列方法上产生类似的结果,这是我的IO界限的情况。 所以对于IO绑定的操作(在我的情况下,从网上读取资源),是最好使用ThreadPools和控制的东西,或者更好的只是依靠TPL? TPL也可以用于IO界限的情况吗? 更新 :我主要关心的是 – 在单核CPU环境下,TPL只是performance得像顺序方法,还是会提供并发性? 我已经阅读了与Microsoft .NET并行编程,所以这本书,但无法find一个确切的答案。 注意:这是我以前的问题的重新措辞[ 是否可以一起使用线程并发和并行? ]这是错误的措词。
我在当前的项目中使用TPL,并使用Parallel.Foreach来旋转很multithreading。 Task类包含Wait()等待,直到任务完成。 像那样,我如何等待Parallel.ForEach完成,然后执行下一个语句?
任务并行库是否有什么可以被认为是对BackgroundWorker类的替代或改进? 我有一个向导式UI的WinForms应用程序,它执行一些长时间运行的任务。 我希望能够有一个标准的进度条响应式的用户界面和取消操作的能力。 我之前用BackgroundWorker做过这个,但是我想知道是否有一些TPL模式可以用来代替?
所以我最近被告知,我是如何使用我的.ContinueWith for Tasks不是正确的方式来使用它们。 我还没有在互联网上find这个证据,所以我会问你们,看看答案是什么。 这里是我如何使用.ContinueWith的一个例子: public Task DoSomething() { return Task.Factory.StartNew(() => { Console.WriteLine("Step 1"); }) .ContinueWith((prevTask) => { Console.WriteLine("Step 2"); }) .ContinueWith((prevTask) => { Console.WriteLine("Step 3"); }); } 现在我知道这是一个简单的例子,它运行速度非常快,但是假设每个任务执行一些更长的操作。 所以,我被告知的是在.ContinueWith中,你需要说prevTask.Wait(); 否则你可以在前一个任务完成之前完成工作。 这甚至可能吗? 我认为我的第二个和第三个任务只会在以前的任务完成时运行。 我被告知如何编写代码: public Task DoSomething() { return Task.Factory.StartNew(() => { Console.WriteLine("Step 1"); }) .ContinueWith((prevTask) => { prevTask.Wait(); Console.WriteLine("Step 2"); }) .ContinueWith((prevTask) => […]
在C#和TPL( 任务并行库 )中, Task类表示一个正在进行的工作,产生一个Ttypes的值。 我想知道什么是Task.FromResult方法的需要? 那就是:在一个已经产生了价值的情况下,有什么需要把它重新包装到一个任务中? 唯一想到的是它被用作接受Task实例的其他方法的一些适配器。