Tag: 任务并行库

WaitAll与WhenAll

Async CTP中的Task.WaitAll()和TaskEx.WhenAll()什么区别? 你能提供一些示例代码来说明不同的用例吗?

同步等待asynchronous操作,为什么Wait()在这里冻结程序

前言 :我正在寻找一个解释,而不仅仅是一个解决scheme。 我已经知道解决scheme。 尽pipe花了几天的时间研究有关基于任务的asynchronous模式(TAP)的asynchronous和等待的MSDN文章,但我仍然对某些更精细的细节感到困惑。 我正在为Windowsapp store应用程序编写logging器,并且要支持asynchronous和同步logging。 asynchronous方法遵循TAP,同步的方法应该隐藏所有这些,并且像普通的方法一样工作。 这是asynchronouslogging的核心方法: private async Task WriteToLogAsync(string text) { StorageFolder folder = ApplicationData.Current.LocalFolder; StorageFile file = await folder.CreateFileAsync("log.log", CreationCollisionOption.OpenIfExists); await FileIO.AppendTextAsync(file, text, Windows.Storage.Streams.UnicodeEncoding.Utf8); } 现在相应的同步方法… 版本1 : private void WriteToLog(string text) { Task task = WriteToLogAsync(text); task.Wait(); } 这看起来是正确的,但它不起作用。 整个程序永远冻结。 版本2 : 嗯..也许任务没有开始? private void WriteToLog(string text) { Task task […]

如果我的界面必须返回任务什么是最好的方式有一个无操作的实现?

在下面的代码中,由于接口, LazyBar类必须从它的方法中返回一个任务(并且为了参数而不能改变)。 如果LazyBar的实现是不寻常的,它发生在快速和同步运行 – 从方法返回一个无操作任务的最好方法是什么? 我已经用了下面的Task.Delay(0) ,但是我想知道这是否有任何性能的副作用,如果函数被称为很多 (为了参数,每秒数百次): 这个语法糖是不是有点大? 它是否开始堵塞我的应用程序的线程池? 编译器切割器是否足以以不同的方式处理Delay(0) ? 将return Task.Run(() => { }); 有什么不同? 有没有更好的办法? using System.Threading.Tasks; namespace MyAsyncTest { internal interface IFooFace { Task WillBeLongRunningAsyncInTheMajorityOfImplementations(); } /// <summary> /// An implementation, that unlike most cases, will not have a long-running /// operation in 'WillBeLongRunningAsyncInTheMajorityOfImplementations' /// </summary> internal class LazyBar : […]

使用任务并行库时如何处理所有未处理的exception?

我在.NET 4.0中使用TPL( 任务并行库 )。 我想通过使用Thread.GetDomain().UnhandledException事件来集中处理所有未处理的exception的逻辑。 但是,在我的应用程序中,事件永远不会被启动TPL代码的线程触发,例如Task.Factory.StartNew(…) 。 事实上,如果我使用像new Thread(threadStart).Start() 。 这篇MSDN文章build议在使用TPL时使用Task#Wait()来捕获AggregateException ,但这不是我想要的,因为它不是“集中”足够的机制。 有没有人遇到同样的问题,还是只是我? 你有这个解决scheme吗?

为什么我应该更喜欢单个“等待Task.WhenAll”多个等待?

如果我不关心任务完成的顺序,只需要它们全部完成,我还应该使用await Task.WhenAll而不是多个await ? 例如DoWord2是DoWord2的首选方法(为什么?): 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", 3000); var t2 […]

我怎样才能防止任务同步延续?

我有一些库(套接字networking)代码,基于TaskCompletionSource<T>提供了一个基于Task的API来处理对请求的响应。 然而,TPL的一个烦恼是,似乎不可能防止同步延续。 我希望能够做的是: 告诉一个TaskCompletionSource<T> ,它不应该允许调用者使用TaskContinuationOptions.ExecuteSynchronously来附加 设置结果( SetResult / TrySetResult )的方式,指定应忽略TaskContinuationOptions.ExecuteSynchronously ,使用池而不是 具体来说,我遇到的问题是传入的数据正在由专门的阅读器处理,如果调用者可以附加TaskContinuationOptions.ExecuteSynchronously他们可以停止阅读器(这不仅影响他们)。 以前,我曾经通过一些骇客来解决这个问题,它检测是否存在任何延续,如果是,则将完成推送到ThreadPool ,但是如果调用者已经饱和他们的工作队列,则会产生显着的影响,因为完成不会得到及时处理。 如果他们使用Task.Wait() (或类似的),他们将基本上自己死锁。 同样,这就是为什么读者是在一个专门的线程,而不是使用工人。 所以; 在我尝试唠叨TPL团队之前,我是否错过了一个选项? 关键点: 我不希望外部呼叫者能够劫持我的线程 我不能使用ThreadPool作为实现,因为它需要在池饱和时工作 下面的例子产生输出(sorting可能因时间而异): Continuation on: Main thread Press [return] Continuation on: Thread pool 问题是一个随机的调用者设法在“主线程”上得到延续。 在真实的代码中,这会中断初级读者; 坏事! 码: using System; using System.Threading; using System.Threading.Tasks; static class Program { static void Identify() { var thread = Thread.CurrentThread; […]

使用MVC5asynchronous的优势是什么?

有什么区别: 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<ActionResult> Login(LoginViewModel model, string returnUrl) { if (ModelState.IsValid) { IdentityResult result = await IdentityManager.Authentication.CheckPasswordAndSignInAsync(AuthenticationManager, model.UserName, model.Password, model.RememberMe); […]

是否有基于任务的替代System.Threading.Timer?

我是.Net 4.0的任务新手,我无法find我认为是基于任务的replace或实现定时器,例如定期任务。 有这样的事吗? 更新我想出了我认为是我的需求的解决scheme,即将“计时器”function包含在任务中,其中子任务全部利用CancellationToken并返回任务以便能够参与进一步的任务步骤。 public static Task StartPeriodicTask(Action action, int intervalInMilliseconds, int delayInMilliseconds, CancellationToken cancelToken) { Action wrapperAction = () => { if (cancelToken.IsCancellationRequested) { return; } action(); }; Action mainAction = () => { TaskCreationOptions attachedToParent = TaskCreationOptions.AttachedToParent; if (cancelToken.IsCancellationRequested) { return; } if (delayInMilliseconds > 0) Thread.Sleep(delayInMilliseconds); while (true) { if (cancelToken.IsCancellationRequested) { […]

ConfigureAwait将继续推送到池线程

这是一个WinForms代码: async void Form1_Load(object sender, EventArgs e) { // on the UI thread Debug.WriteLine(new { where = "before", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread }); var tcs = new TaskCompletionSource<bool>(); this.BeginInvoke(new MethodInvoker(() => tcs.SetResult(true))); await tcs.Task.ContinueWith(t => { // still on the UI thread Debug.WriteLine(new { where = "ContinueWith", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread }); }, TaskContinuationOptions.ExecuteSynchronously).ConfigureAwait(false); // on a pool thread […]

WebAPI中长时间运行的任务

这是我的问题:我需要在ApiController中调用多个第三方方法。 这些方法的签名是Task DoSomethingAsync(SomeClass someData, SomeOtherClass moreData) 。 我希望这些调用在ApiController将数据发送回客户端后在后台继续运行。 当DoSomethingAsync完成时,我想做一些日志logging,也许保存一些数据到文件系统。 我怎样才能做到这一点? 我宁愿使用asyny / await语法。