Questions tagged «task-parallel-library»

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

4
任务构造器中的取消令牌:为什么?
某些System.Threading.Tasks.Task构造函数将a CancellationToken作为参数: CancellationTokenSource source = new CancellationTokenSource(); Task t = new Task (/* method */, source.Token); 令我感到困惑的是,没有办法从方法主体内部真正获取传入的令牌(例如,没有类似的东西Task.CurrentTask.CancellationToken)。令牌必须通过某种其他机制提供,例如状态对象或在lambda中捕获。 那么在构造函数中提供取消令牌有什么目的呢?

6
Task.Start / Wait和Async / Await有什么区别?
我可能会丢失一些东西,但是这样做之间有什么区别: public void MyMethod() { Task t = Task.Factory.StartNew(DoSomethingThatTakesTime); t.Wait(); UpdateLabelToSayItsComplete(); } public async void MyMethod() { var result = Task.Factory.StartNew(DoSomethingThatTakesTime); await result; UpdateLabelToSayItsComplete(); } private void DoSomethingThatTakesTime() { Thread.Sleep(10000); }

11
什么时候应该使用TaskCompletionSource <T>?
AFAIK,它所知道的只是在某个时候,它的SetResult或SetException方法被调用以Task&lt;T&gt;通过其Task属性完成公开。 换句话说,它充当a Task&lt;TResult&gt;及其完成的生产者。 我在这里看到了示例: 如果我需要一种异步执行Func并有一个Task来表示该操作的方法。 public static Task&lt;T&gt; RunAsync&lt;T&gt;(Func&lt;T&gt; function) { if (function == null) throw new ArgumentNullException(“function”); var tcs = new TaskCompletionSource&lt;T&gt;(); ThreadPool.QueueUserWorkItem(_ =&gt; { try { T result = function(); tcs.SetResult(result); } catch(Exception exc) { tcs.SetException(exc); } }); return tcs.Task; } *如果我没有,可以使用Task.Factory.StartNew-但我确实有Task.Factory.StartNew。 题: 可有人请举例相关的情景解释直接到TaskCompletionSource 而不是一个假想中,我没有的情况 Task.Factory.StartNew?

11
.Net 4.0中没有ConcurrentList <T>?
我很高兴看到System.Collections.Concurrent.Net 4.0中的新名称空间,这真是太好了!我见过ConcurrentDictionary,ConcurrentQueue,ConcurrentStack,ConcurrentBag和BlockingCollection。 似乎神秘失踪的一件事是ConcurrentList&lt;T&gt;。我是否必须自己写一个(或从网络上获取它:))? 我在这里错过明显的东西吗?


3
等待vs Task.Wait-死锁?
我不太明白之间的差别Task.Wait和await。 我在ASP.NET WebAPI服务中具有类似于以下功能的内容: public class TestController : ApiController { public static async Task&lt;string&gt; Foo() { await Task.Delay(1).ConfigureAwait(false); return ""; } public async static Task&lt;string&gt; Bar() { return await Foo(); } public async static Task&lt;string&gt; Ros() { return await Bar(); } // GET api/test public IEnumerable&lt;string&gt; Get() { Task.WaitAll(Enumerable.Range(0, 10).Select(x =&gt; …

6
HttpClient-任务已取消?
当有一个或两个任务时,它工作正常,但是当我们列出多个任务时,会引发错误“任务已取消”。 List&lt;Task&gt; allTasks = new List&lt;Task&gt;(); allTasks.Add(....); allTasks.Add(....); Task.WaitAll(allTasks.ToArray(), configuration.CancellationToken); private static Task&lt;T&gt; HttpClientSendAsync&lt;T&gt;(string url, object data, HttpMethod method, string contentType, CancellationToken token) { HttpRequestMessage httpRequestMessage = new HttpRequestMessage(method, url); HttpClient httpClient = new HttpClient(); httpClient.Timeout = new TimeSpan(Constants.TimeOut); if (data != null) { byte[] byteArray = Encoding.ASCII.GetBytes(Helper.ToJSON(data)); MemoryStream memoryStream …

7
Task.Run()和Task.Factory.StartNew()有什么区别
我有方法: private static void Method() { Console.WriteLine("Method() started"); for (var i = 0; i &lt; 20; i++) { Console.WriteLine("Method() Counter = " + i); Thread.Sleep(500); } Console.WriteLine("Method() finished"); } 我想在新任务中启动此方法。我可以像这样开始新任务 var task = Task.Factory.StartNew(new Action(Method)); 或这个 var task = Task.Run(new Action(Method)); 但是Task.Run()和之间有什么区别Task.Factory.StartNew()。创建Task实例后,他们两个都立即使用ThreadPool并启动Method()。什么时候应该使用第一个变量,什么时候应该使用第二个变量?


9
在Parallel.ForEach中嵌套等待
在Metro应用程序中,我需要执行许多WCF调用。需要进行大量调用,因此我需要在并行循环中进行调用。问题在于并行循环在WCF调用全部完成之前退出。 您将如何重构它以使其按预期工作? var ids = new List&lt;string&gt;() { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }; var customers = new System.Collections.Concurrent.BlockingCollection&lt;Customer&gt;(); Parallel.ForEach(ids, async i =&gt; { ICustomerRepo repo = new CustomerRepo(); var cust = await repo.GetCustomer(i); customers.Add(cust); }); foreach ( var customer in customers ) { Console.WriteLine(customer.ID); …

4
如何取消等待中的任务?
我正在玩这些Windows 8 WinRT任务,并且正在尝试使用以下方法取消任务,并且在某种程度上可以正常工作。确实会调用CancelNotification方法,这使您认为任务已被取消,但是在后台任务继续运行,然后在完成后,任务的状态始终为完成且从未取消。取消任务后,是否有办法完全停止任务? private async void TryTask() { CancellationTokenSource source = new CancellationTokenSource(); source.Token.Register(CancelNotification); source.CancelAfter(TimeSpan.FromSeconds(1)); var task = Task&lt;int&gt;.Factory.StartNew(() =&gt; slowFunc(1, 2), source.Token); await task; if (task.IsCompleted) { MessageDialog md = new MessageDialog(task.Result.ToString()); await md.ShowAsync(); } else { MessageDialog md = new MessageDialog("Uncompleted"); await md.ShowAsync(); } } private int slowFunc(int …

7
何时处置CancellationTokenSource?
该课程CancellationTokenSource是一次性的。快速浏览Reflector即可证明KernelEvent,(很可能是)非托管资源的使用。由于CancellationTokenSource没有终结器,因此如果不处理它,GC将不会这样做。 另一方面,如果您查看MSDN文章“ 托管线程中的取消”中列出的示例,则只有一个代码片段会处理该令牌。 用代码处理它的正确方法是什么? using如果不等待,则无法包装用于启动并行任务的代码。而且只有在您不等待的情况下取消才有意义。 当然,您可以ContinueWith通过Dispose电话添加任务,但这就是方法吗? 可取消的PLINQ查询如何处理,这些查询不同步回去,而只是在最后做一些事情?比方说.ForAll(x =&gt; Console.Write(x))? 可重用吗?可以将同一令牌用于多个调用,然后将其与主机组件(例如UI控件)一起处置吗? 因为它没有像一Reset对清理方法IsCancelRequested和Token字段我想这是不能重复使用,这样每次启动一个任务(或PLINQ查询),你应该创建一个新的。是真的吗 如果是,我的问题是Dispose在那么多CancellationTokenSource实例上处理的正确和推荐策略是什么?

4
异步/等待与BackgroundWorker
在过去的几天中,我测试了.net 4.5和c#5的新功能。 我喜欢它的新异步/等待功能。之前,我曾使用BackgroundWorker通过响应UI在后台处理更长的进程。 我的问题是:有了这些不错的新功能之后,什么时候应该使用async / await以及什么时候使用BackgroundWorker?两者都有哪些常见方案?

2
关于Task.Start(),Task.Run()和Task.Factory.StartNew()的用法
我只看到3个有关TPL使用的例程,它们执行相同的工作;这是代码: public static void Main() { Thread.CurrentThread.Name = "Main"; // Create a task and supply a user delegate by using a lambda expression. Task taskA = new Task( () =&gt; Console.WriteLine("Hello from taskA.")); // Start the task. taskA.Start(); // Output a message from the calling thread. Console.WriteLine("Hello from thread '{0}'.", …

5
带有异步Lambda的并行foreach
我想并行处理一个集合,但是在实现它时遇到了麻烦,因此希望获得一些帮助。 如果要在并行循环的lambda中调用C#中标记为async的方法,则会出现问题。例如: var bag = new ConcurrentBag&lt;object&gt;(); Parallel.ForEach(myCollection, async item =&gt; { // some pre stuff var response = await GetData(item); bag.Add(response); // some post stuff } var count = bag.Count; 计数为0时会发生问题,因为创建的所有线程实际上都是后台线程,并且Parallel.ForEach调用不等待完成。如果删除async关键字,则该方法如下所示: var bag = new ConcurrentBag&lt;object&gt;(); Parallel.ForEach(myCollection, item =&gt; { // some pre stuff var responseTask = await GetData(item); …

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.