task-parallel-library相关内容
在异步 ASP.NET Web API 控制器方法中的 await 之后,我注意到一个意外的(我会说是冗余的)线程切换. 例如,下面我希望在位置 #2 和 3# 处看到相同的 ManagedThreadId,但大多数情况下我在 #3 处看到不同的线程: 公共类 TestController : ApiController{公共异步任务获取数据(){Debug.WriteLine(new{w
..
我有以下代码: List>任务 = tasksQuery.ToList();而 (tasks.Any()){任务CompletedTask = await Task.WhenAny(tasks);如果(等待完成的任务)返回真;tasks.Remove(completedTask);} 它并行启动任务.当第一个完成的任务返回 true 时,该方法返回 true. 我的问题是: 所有剩
..
谁能解释一下这个,也许我遗漏了一些明显的东西. 这两种情况在行为上似乎相同,但实际上并非如此. 案例 1: 用一个 async Action, 开始一个任务,它会在一段时间内完成一些工作: var t = Task.Run(async () => { await Task.Delay(2000); }); 第二个任务等待第一个: var waitingTask = Task
..
考虑一下, Task task = new Task(async() =>{等待 TaskEx.Delay(1000);});task.Start();任务.等待(); 调用 task.Wait() 不会等待任务完成并立即执行下一行,但如果我将异步 lambda 表达式包装到方法调用中,代码会按预期工作. 私有静态异步任务AwaitableMethod(){等待 TaskEx.Delay(1
..
如果此问题是基于意见的,请提前道歉.缺乏 Task.Yield此处已经讨论了不会捕获执行上下文的版本.显然,此功能在早期版本的 Async CTP 中以某种形式存在,但由于很容易被误用而被删除. IMO,这样的功能很容易被误用,就像 Task.Run 本身一样.这就是我的意思.想象一下,有一个可等待的 SwitchContext.Yield API,它在 ThreadPool 上调度继续,因
..
下面的方法有什么区别吗?一个比另一个更可取吗? public static async Task SendAsync1(string to, string subject, string htmlBody) {//...等待 smtp.SendMailAsync(message);//没有返回语句}公共静态任务 SendAsync2(字符串到,字符串主题,字符串 htmlBody){//...返
..
我想等待带有超时和观察取消的手动重置事件.我想出了类似下面的东西.手动重置事件对象由我无法控制的 API 提供.有没有办法在不占用和阻止来自 ThreadPool 的线程的情况下实现这一点? static TaskTaskFromWaitHandle(WaitHandle mre, int timeout, CancellationToken ct){返回 Task.Run(() =>{bool
..
在性能方面,这两个方法会同时运行 GetAllWidgets() 和 GetAllFoos() 吗? 有什么理由使用一个而不是另一个吗?编译器的幕后似乎发生了很多事情,所以我不清楚. ============ 方法A:使用多个等待====================== 公共异步任务方法A(){var customer = new Customer();customer.Widg
..
我正在创建一段代码,用于从我们拥有的遗留系统中获取网页.为了避免过多的查询,我缓存了获取到的URL.我正在使用 Monitor.Enter、Monitor.Exit 和双重检查以避免该请求被发出两次,但是当使用 Monitor.Exit,我收到此异常: System.Threading.SynchronizationLockException 被捕获HResult=-2146233064Mess
..
在下面的代码中,由于接口的原因,LazyBar 类必须从它的方法中返回一个任务(并且为了参数不能改变).如果 LazyBar 的实现不寻常,因为它碰巧快速且同步地运行 - 从该方法返回 No-Operation 任务的最佳方法是什么? 我已经使用了下面的 Task.Delay(0),但是我想知道如果该函数被称为 lot 是否有任何性能副作用(为了论证,每秒说数百次): 这个句法糖是否可
..
我将如何构建下面的代码以便调用异步方法? Parallel.For(0, heights.Count(), delegate(int i){allSheets.AddRange(await BuildSheetsAsync(userID,elevations[i],includeLabels));}); 解决方案 Parallel.For() 不适用于 async 方法.如果您不需要限制并行
..
我有一些库(套接字网络)代码,它提供了一个基于 Task 的 API,用于基于 TaskCompletionSource 的待处理请求响应.然而,在 TPL 中有一个烦恼,因为它似乎不可能阻止同步延续.我希望能够做的是: 告诉 TaskCompletionSource 不允许调用者附加 TaskContinuationOptions.ExecuteSynchronously,或 以指定应忽
..
试图理解 TPL 和 TPL 之间的区别async/await 在创建线程时. 我相信 TPL (TaskFactory.StartNew) 的工作原理类似于 ThreadPool.QueueUserWorkItem,因为它在线程池中的线程上排队工作.当然,除非您使用 TaskCreationOptions.LongRunning 来创建一个新线程. 我认为 async/await 的
..
这是一些 WinForms 代码: async void Form1_Load(object sender, EventArgs e){//在 UI 线程上Debug.WriteLine(new { where = "before",Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread });v
..
阅读时间太长. 使用 Task.ConfigureAwait(continueOnCapturedContext: false) 可能会引入冗余线程切换.我正在为此寻找一致的解决方案. 长版本.ConfigureAwait(false) 背后的主要设计目标是减少 await 的冗余 SynchronizationContext.Post 继续回调,在可能的情况下.这通常意味着更少的线程切换和
..
我的 main() 中有这个构造,它创建了 var tasks = new List();var t = Task.Factory.StartNew(异步 () =>{Foo.Fim();等待 Foo.DoBar();});//DoBar未完成t.等待();//Foo.Fim() 完成,Foo.DoBar 应该但不是 然而,当我 .Wait for t 时,它不会等待对 DoBar() 的调用
..
在 C# 和 TPL(任务并行库)中,Task class 表示正在进行的工作,该工作产生类型 T 的值. 我想知道 Task.FromResult 方法需要什么? 也就是说:在你手头已经有了产生的值的情况下,还有什么需要把它包装回一个任务? 唯一想到的是它被用作接受 Task 实例的其他方法的一些适配器. 解决方案 我发现了两个常见的用例: 当您实现一个允许异步调
..
有人可以解释一下以下示例中 await 和 ContinueWith 是否是同义词.我是第一次尝试使用 TPL,并且已经阅读了所有文档,但不明白其中的区别. 等待: String webText = await getWebPage(uri);等待 parseData(webText); 继续: TaskwebText = new Task(() => getWebPage(uri))
..
我想异步await BlockingCollection.Take() 的结果,所以我不阻塞线程.寻找这样的东西: var item = await blocksCollection.TakeAsync(); 我知道我可以做到: var item = await Task.Run(() =>blockingCollection.Take()); 但这有点扼杀了整个想法,因为另一个线程(Th
..
我看不到查看哪些任务正在运行的方法.有 Task.Current 属性,但是如果有多个任务在运行呢?有没有办法获得这种信息? 或者,是否有一种内置方式可以在任务开始或完成时获得通知? 解决方案 嘿 Mike,在 TPL 中没有访问待处理任务列表的公共方式.使其可用于调试器的机制依赖于所有线程将在枚举时被冻结的事实,因此它不能在运行时使用. 是的,有一种内置方式可以在任务完成时收
..