问题标签 [continuewith]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
multithreading - TPL 嵌套任务还是 ContinueWith()?把WhenAll放在哪里?
嵌套任务还是 ContinueWith()?在哪里放置WhenAll()
我是 TPL 的新手,我想要一些有关如何以正确方式完成此任务的指导。我已经用这些资源阅读了 TPL 库,但我仍然不清楚最好的方法:
- 使用 MS .NET 进行并行编程(在线阅读):https ://msdn.microsoft.com/en-us/library/ff963553.aspx
- MS 并行编程论坛:https ://social.msdn.microsoft.com/Forums/en-US/home?forum=parallelextensions
- 使用 .NET Framework 进行并行编程的示例
- 基于任务的异步编程
- 和别的
最终结果是向第三方 API 提交超过 50 万条记录。尝试一步完成会导致超时和其他随机错误。
这是当前的逻辑,它只是部分成功。
AssignGroupNumbers
为表中的每条记录分配一个组号。这导致每条记录被分配到 n 个组中的一个,最多 50 个左右。最初的想法是在一个新线程上处理这些组中的每一个,因此 GroupCount 是用户定义的,允许我们尝试不同数量的线程。对于 TPL,这可能不是必需的。ProcessSourceData
读取特定组的记录并调用ProcessOneGroup
ProcessOneGroup
创建每个组中记录的小型 XML 文档(大约 100 条左右)。这也是一个用户定义的数字以允许进行实验。ProcessOneGroup
然后调用SubmitToNLS
传入 XML 字符串。
SubmitToNLS
是返回成功或失败状态的第三方 API。
该图显示了我如何将其分解为任务,所以我的问题是:
如何在不阻塞 UI 的情况下完成此操作。我已经尝试过 [Task.Run( --> Parallel.ForEach] ,但我如何跟进后续任务?
在这种情况下,提供进度条、错误处理和用户取消的最佳方式是什么?
我希望图表和叙述能提供足够的信息。我已经尝试了几种方法,但目前没有一个像样的代码示例。
更新:经过大量阅读和反复试验,我编写了这段代码,似乎可以完成这项工作。它不是 DataFlow,但我打算在我的下一个项目中使用它。你看到这段代码有什么明显的问题吗?特别是关于异常处理和更新 UI?
c# - 将任务转换为任务(包装任务,返回类型为 T)
我已经阅读了这个问题,但在我的情况下它更简单,因为我不必使用Result
属性。所以我想知道我是否可以采用比斯蒂芬·克利里的回答提供的更简单的方法。
假设我有这个简单的界面。
该接口提供了异步加载对象的方法。它不返回任何内容,因为加载结果是对象本身。
(接口是内部的,因此显式实现以避免暴露实现。)
这是我加载二进制数据的方式。
我想让这个更流畅和详细,所以我写了这个扩展方法
现在加载变成了这样。
这里有什么我应该担心使用这种方法的吗?例如异常处理等?
c# - C# Chained ContinueWith 不等待上一个任务完成
我正在测试 C# async/await 的异步性,并意外地发现 ContinueWith 的后续代码不等待前一个任务完成:
使用以下测试方法执行:
输出显示运行 0.0、1.0 和 2.0 的执行正确地异步执行,但随后的 x.1 和 x.2 几乎立即开始,并且 x.2 实际上在 x.1 之前完成。例如如下所示:
似乎 continueWith 只会等待第一个任务(0),而不管后续链如何。我可以通过将第二个 ContinueWith 嵌套在第一个 Continuewith 块中来解决这个问题。
我的代码有问题吗?我假设 Console.WriteLine 尊重 FIFO。
c# - 在等待的任务上使用 ContinueWith() 并在里面调用 Task.Result
我遇到了以下代码,它使用 ContinueWith() 来等待结果。
是否ContinueWith()
阻塞调用线程直到任务从GetUserAsync()
调用返回?
由于在task.Result
计划的 ContinueWith() 内,在等待前件时是否有任何阻塞task
?
我在其他几个地方看到过这种类型的代码,这是否被认为是异步/等待模式的最佳实践?我希望GetUserAsync()
调用返回结果而不是使用 aContinueWith()
等待它。
c# - Async Await and ContinueWith 未按预期工作
我有以下在 .NET Standard 2.0 上运行的代码:
我们注意到它没有按预期运行。我们认为,当您等待调用 TryRun 时,它总是会调用可以处理异常/取消并返回作业结果的延续。我们希望减少创建的异步状态机的数量......但是,情况并非如此,它只是爆炸了。这是一个较小的示例(创建一个新的 .net core 2.0 控制台应用程序并粘贴以下内容:
您可能需要<LangVersion>Latest</LangVersion>
在您的 csproj 中。
更新
我们最终使用了以下代码:
c# - 为什么使用 ContinueWith 执行任务时 Windows 窗体 UI 被阻止?
我花了几天时间在 Google 中搜索并试图了解为什么在我的情况下 Windows Forms UI在Tasks中执行 ping 时被阻止。我看到很多类似的案例,但没有一个能解释我的具体案例。
问题描述:
我有一个异步发送 ping 的应用程序。每个 ping 都在任务内部发送。我.ContinueWith
用来接收 ping 的结果并将其打印到文本框而不阻塞 UI 线程。如果我启动所有 ping 一次,它工作正常。如果我添加一个while {run}
循环以使它们永远运行,我的 UI 将变得无响应并被阻止,并且没有任何结果打印到文本框。
有问题的代码:
问题:
- 为什么 UI 会被
while
循环阻塞,为什么没有循环不会阻塞? - 如何修改我的代码以仍然能够在不阻塞 UI 的情况下使用 Tasks 进行 ping?
- 有没有更好的方法可以同时向多个 IP 地址发起无休止的 ping 操作?
完整代码:
c# - Is there a way to use TaskContinuationOptions like a finally
Is there a way to use TaskContinuationOptions like a finally?
Here is my code
Here is my question
I wanted to use last ContinueWith like a finally. So, I changed my last ContinueWith phrase like this
I thought it be used when the last task is complete or fault.
But It throws a error.
I hope there is a good way to solve my problem.
thank you for reading my question.
c# - 继续更改我的列表顺序
我有一个信息列表这些信息中的每一个都必须在用户控件中,创建用户控件需要很长时间并且用户界面挂起所以我使用Task.Delay.ContinuWith ()
(为了在添加任何项目后更新用户界面)
但是有是个问题,信息没有按顺序显示
输出是:
身份证 | 姓名 |
10 | 阿里
9 | 哈迪
1 | 哈桑
15 | kajsd
...
但是应该收到如下信息
身份证 | 姓名 |
1 | 哈桑
2 | 广告
2 | 广告
3 | 广告
...
c# - Task中的异常属性什么时候可以有值?
我想知道“continueWhith”何时有异常。
我做了一个这样的代码。
我预计最后 continueWith 任务中会有异常,但事实并非如此。
任务中最后没有异常是对的吗?
我想知道如何在 continueWith 中设置异常属性。
谢谢你。