Tag: 任务并行库

在任务exception的情况下,根据用户input多次重试任务

在我的应用程序中的所有服务调用都是作为任务来实现的。当任务发生故障时,我需要向用户提供一个对话框,以重试上次操作失败。如果用户select重试,程序应该重试任务,否则程序的执行应该在loggingexception之后继续执行。任何人都已经对如何实现这个function有了一个高层次的想法?

任务sorting和re-entracy

我有以下情况,我认为这可能是相当普遍的: 有一个任务(一个UI命令处理程序)可以完成同步或asynchronous。 命令可能比他们正在处理更快到达。 如果某个命令已经有待处理的任务,那么新的命令处理程序任务应该排队并按顺序处理。 每个新任务的结果可能取决于前一个任务的结果。 取消应该遵守,但为了简单起见,我想把它放在这个问题的范围之外。 此外,线程安全性(并发性)不是必需的,但必须支持重入性。 下面是我想要实现的基本示例(作为控制台应用程序,为了简单起见): using System; using System.Threading.Tasks; namespace ConsoleApp { class Program { static void Main(string[] args) { var asyncOp = new AsyncOp<int>(); Func<int, Task<int>> handleAsync = async (arg) => { Console.WriteLine("this task arg: " + arg); //await Task.Delay(arg); // make it async return await Task.FromResult(arg); // sync }; Console.WriteLine("Test […]

是否使用任务(TPL)库使应用程序multithreading?

最近在接受采访时,我得到了这个问题。 问:你写了multithreading应用程序吗? 答:是的 问:要多解释一下? 答:我使用Tasks (任务并行库)来执行一些任务,如waiting for some info from internet while loading UI 。 这提高了我的应用程序可用性。 问:但是,您刚刚使用过TPL意味着您已经编写了multithreaded应用程序? 我:(不知道该说什么1) 那么,什么是一个multithreading应用程序? 与使用Tasks不同吗?

当前的SynchronizationContext不能用作TaskScheduler

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

浏览器取消请求时出现ASP.NET Web API OperationCanceledException

当用户加载一个页面时,会发出一个或多个ajax请求,这些请求会触发ASP.NET Web API 2控制器。 如果用户导航到另一个页面,在这些Ajax请求完成之前,请求被浏览器取消。 我们的ELMAH HttpModule会为每个取消的请求logging两个错误: 错误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.<InvokeActionAsyncCore>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.<ExecuteAsync>d__2.MoveNext() — End of stack trace from previous […]

为什么这个asynchronous操作挂起?

我有一个多层.Net 4.5应用程序调用一个方法使用C#的新async和await关键字只是挂起,我看不出为什么。 在底部,我有一个asynchronous方法,扩展我们的数据库实用程序OurDBConn (基本上是底层DBConnection和DBCommand对象的包装): public static async Task<T> ExecuteAsync<T>(this OurDBConn dataSource, Func<OurDBConn, T> function) { string connectionString = dataSource.ConnectionString; // Start the SQL and pass back to the caller until finished T result = await Task.Run( () => { // Copy the SQL connection so that we don't get two commands running at the same […]

正确的方法来实现一个永无止境的任务。 (定时器vs任务)

所以,只要应用程序正在运行或请求取消,我的应用程序就需要几乎连续地执行一个操作(每次运行之间暂停10秒左右)。 它需要做的工作可能需要长达30秒。 使用System.Timers.Timer并使用AutoReset确保它在上一个“打勾”完成之前不会执行操作会更好吗? 还是应该使用带有取消标记的LongRunning模式的常规任务,并在其中调用执行工作的动作,并在调用之间使用10秒的Thread.Sleep? 至于asynchronous/等待模式,我不确定这是否合适,因为我没有任何工作返回值。 CancellationTokenSource wtoken; Task task; void StopWork() { wtoken.Cancel(); try { task.Wait(); } catch(AggregateException) { } } void StartWork() { wtoken = new CancellationTokenSource(); task = Task.Factory.StartNew(() => { while (true) { wtoken.Token.ThrowIfCancellationRequested(); DoWork(); Thread.Sleep(10000); } }, wtoken, TaskCreationOptions.LongRunning); } void DoWork() { // Some work that takes up to 30 […]

UnobservedTaskException被抛出,但它由TaskScheduler.UnobservedTaskException处理程序和一个continuation OnlyOnFaulted处理程序处理

可能重复: 使用任务并行库时如何处理所有未处理的exception? @Buu Nguyen 嗨,解决scheme是基于你的想法 有人把它尽可能重复,这里有一些不同的东西。 我告诉了答案,这个想法帮助我。 有我的评论。 我在TPL编程方面遇到问题。 即时通讯UnobservedTaskException,即时通讯使用@ h4165f8ghd4f854d6f8h解决scheme[ 任务的exception(s)没有观察到通过等待任务或访问其exception属性。 因此,未观察到的exception是处理exception,但仍然得到UnobservedTaskException。 在启动任务之前,我也提供了以下代码: TaskScheduler.UnobservedTaskException += (sender, e) => { e.SetObserved(); throw e.Exception; }; 但[ exception抛出任务线程,没有被UnobservedTaskException捕获 ]告诉它不捕获每个TPL未处理的exception。 我想泡沫例外,直到达到堆栈顶部,然后处理它。 有人可以帮助我? @Jon Skeet 嗨,我做得更小了 现在编辑它 感谢您的参与 做了更多 class Program { static void Main(string[] args) { Program p = new Program(); p.tplTestOne(); } public void tplTestOne() { //————————————————- […]

如何在wpf背景中执行任务,同时能够提供报告并允许取消?

我想在点击一个wpfbutton后执行一个长时间运行的任务。 在这里,我做了什么。 private void Start(object sender, RoutedEventArgs e) { for (int i = 0; i < 10; i++) { Thread.Sleep(2000); // simulate task } } 问题是,这将使wpf gui无响应。 我也想每隔1秒允许取消和报告进度。 我展开下面的代码。 DispatcherTimer dispatcherTimer = new DispatcherTimer(); // get progress every second private int progress = 0; // for progress reporting private bool isCancelled = false; // cancellation […]

我可以在.net 3.5项目中使用任务并行库吗?

我听说任务并行库可以在.net 3.5项目中使用。 这是正确的,如果是的话,我该如何使用它? 在.NET 4.0中,它驻留在System.Threading中,但是当我select.Net 3.5作为Visual Studio 2010中的目标时,我无法访问像Parallel和Parallel这样的类。