Questions tagged «task-parallel-library»

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

5
为什么CancellationToken与CancellationTokenSource分开?
我正在寻找为什么CancellationToken除了CancellationTokenSource类之外还引入了.NET 结构的理由。我了解如何使用API​​,但也想了解为什么采用这种方式设计。 即,为什么有: var cts = new CancellationTokenSource(); SomeCancellableOperation(cts.Token); ... public void SomeCancellableOperation(CancellationToken token) { ... token.ThrowIfCancellationRequested(); ... } 而不是CancellationTokenSource像这样直接传递: var cts = new CancellationTokenSource(); SomeCancellableOperation(cts); ... public void SomeCancellableOperation(CancellationTokenSource cts) { ... cts.ThrowIfCancellationRequested(); ... } 这是否基于以下事实进行性能优化:取消状态检查比传递令牌更频繁? 这样就CancellationTokenSource可以跟踪和更新CancellationTokens,对于每个令牌,取消检查是本地访问? 鉴于在两种情况下没有锁定的挥发性布尔变量就足够了,我仍然不明白为什么这样做会更快。 谢谢!


5
为什么我要在多个等待中选择一个“等待任务.WhenAll”?
如果我不在乎任务完成的顺序,而只需要全部完成,我还是应该使用await Task.WhenAll而不是多个await?例如,DoWork2下面是一种首选方法DoWork1(为什么?): using System; using System.Threading.Tasks; namespace ConsoleApp { class Program { static async Task<string> DoTaskAsync(string name, int timeout) { var start = DateTime.Now; Console.WriteLine("Enter {0}, {1}", name, timeout); await Task.Delay(timeout); Console.WriteLine("Exit {0}, {1}", name, (DateTime.Now - start).TotalMilliseconds); return name; } static async Task DoWork1() { var t1 = DoTaskAsync("t1.1", …

5
创建完成的Task <T>
我正在实现一个方法,Task&lt;Result&gt; StartSomeTask()并且碰巧在调用该方法之前已经知道了结果。如何创建已经完成的Task &lt;T&gt;? 这是我目前正在做的: private readonly Result theResult = new Result(); public override Task&lt;Result&gt; StartSomeTask() { var task = new Task&lt;Result&gt;(() =&gt; theResult); task.RunSynchronously(CurrentThreadTaskScheduler.CurrentThread); return task; } 有更好的解决方案吗?

3
不对TPL Task对象调用Dispose()是否可以接受?
我想触发任务在后台线程上运行。我不想等待任务完成。 在.net 3.5中,我应该这样做: ThreadPool.QueueUserWorkItem(d =&gt; { DoSomething(); }); 在.net 4中,建议使用TPL。我看到的推荐的常见模式是: Task.Factory.StartNew(() =&gt; { DoSomething(); }); 但是,该StartNew()方法返回一个Task实现的对象IDisposable。推荐这种模式的人似乎忽略了这一点。有关该Task.Dispose()方法的MSDN文档说: “在释放对任务的最后引用之前,请始终致电Dispose。” 您不能在任务完成之前对其进行调用处置,因此让主线程等待并进行调用处置首先会破坏在后台线程上执行任务的目的。似乎也没有任何可用于清理的完成/完成事件。 Task类的MSDN页面没有对此发表评论,而《 Pro C#2010 ...》这本书推荐了相同的模式,并且对任务处理没有评论。 我知道如果我只留下它,终结器最终会抓住它,但是当我做很多工作而忘了像这样的任务而终结器线程不堪重负时,这会回来咬我吗? 所以我的问题是: 是否可以接受不叫Dispose()就Task在这种情况下类?如果是这样,为什么而且存在风险/后果? 有没有讨论这个的文档? 还是有适当的方法来处理Task我错过的对象? 还是有另一种通过TPL做事忘了任务的方法?


3
在MVC5中使用异步的优势是什么?
之间有什么区别? public ActionResult Login(LoginViewModel model, string returnUrl) { if (ModelState.IsValid) { IdentityResult result = IdentityManager.Authentication.CheckPasswordAndSignIn(AuthenticationManager, model.UserName, model.Password, model.RememberMe); if (result.Success) { return Redirect("~/home"); } else { AddErrors(result); } } return View(model); } 和: [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task&lt;ActionResult&gt; Login(LoginViewModel model, string returnUrl) { if (ModelState.IsValid) { IdentityResult result = …

7
浏览器取消请求时,ASP.NET Web API OperationCanceledException
当用户加载页面时,它发出一个或多个ajax请求,这些请求命中ASP.NET Web API 2控制器。如果用户导航到另一个页面,则在这些ajax请求完成之前,浏览器将取消这些请求。然后,我们的ELMAH HttpModule为每个取消的请求记录两个错误: 错误1: System.Threading.Tasks.TaskCanceledException: A task was canceled. at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at System.Web.Http.Controllers.ApiControllerActionInvoker.&lt;InvokeActionAsyncCore&gt;d__0.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() at System.Web.Http.Controllers.ActionFilterResult.&lt;ExecuteAsync&gt;d__2.MoveNext() --- End of stack …

2
等待和ContinueWith之间的区别
在下面的示例中,有人可以解释是否await和ContinueWith是同义词。我正在尝试第一次使用TPL,并且已经阅读了所有文档,但不了解其中的区别。 等待: String webText = await getWebPage(uri); await parseData(webText); ContinueWith: Task&lt;String&gt; webText = new Task&lt;String&gt;(() =&gt; getWebPage(uri)); Task continue = webText.ContinueWith((task) =&gt; parseData(task.Result)); webText.Start(); continue.Wait(); 在特定情况下,一个相对于其他优先吗?

6
并行运行两个异步任务,并在.NET 4.5中收集结果
我已经尝试了一段时间,以获取一些我认为使用.NET 4.5会很简单的东西 我想同时启动两个长时间运行的任务,并 以最佳的C#4.5(RTM)方式收集结果 以下作品有效,但我不喜欢,因为: 我想Sleep成为一个异步方法,以便可以使用await其他方法 看起来笨拙 Task.Run() 我认为这根本没有使用任何新的语言功能! 工作代码: public static void Go() { Console.WriteLine("Starting"); var task1 = Task.Run(() =&gt; Sleep(5000)); var task2 = Task.Run(() =&gt; Sleep(3000)); int totalSlept = task1.Result + task2.Result; Console.WriteLine("Slept for a total of " + totalSlept + " ms"); } private static int Sleep(int …

13
如何限制并发异步I / O操作的数量?
// let's say there is a list of 1000+ URLs string[] urls = { "http://google.com", "http://yahoo.com", ... }; // now let's send HTTP requests to each of these URLs in parallel urls.AsParallel().ForAll(async (url) =&gt; { var client = new HttpClient(); var html = await client.GetStringAsync(url); }); 这是问题所在,它会同时启动1000多个Web请求。有没有简单的方法来限制这些异步http请求的并发数量?这样,在任何给定时间下载的网页都不会超过20个。如何以最有效的方式做到这一点?

5
为什么此异步操作挂起?
我有一个多层.Net 4.5应用程序,该应用程序使用C#的new async和await挂起的关键字来调用方法,但我不知道为什么。 在底部,我有一个异步方法来扩展我们的数据库实用程序OurDBConn(基本上是基础DBConnection和DBCommand对象的包装器): public static async Task&lt;T&gt; ExecuteAsync&lt;T&gt;(this OurDBConn dataSource, Func&lt;OurDBConn, T&gt; function) { string connectionString = dataSource.ConnectionString; // Start the SQL and pass back to the caller until finished T result = await Task.Run( () =&gt; { // Copy the SQL connection so that we don't get two …



3
当前的SynchronizationContext不能用作TaskScheduler
我正在使用Tasks在ViewModel中运行长时间运行的服务器调用,并且Dispatcher使用整理了结果TaskScheduler.FromSyncronizationContext()。例如: var context = TaskScheduler.FromCurrentSynchronizationContext(); this.Message = "Loading..."; Task task = Task.Factory.StartNew(() =&gt; { ... }) .ContinueWith(x =&gt; this.Message = "Completed" , context); 当我执行应用程序时,这工作正常。但是,当我运行NUnit测试时,Resharper我收到的错误消息FromCurrentSynchronizationContext为: 当前的SynchronizationContext不能用作TaskScheduler。 我猜这是因为测试是在工作线程上运行的。如何确保测试在主线程上运行?欢迎其他任何建议。

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.