- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我如何合并 List<T>
用于以后执行的基于 TPL 的任务?
public async IEnumerable<Task<string>> CreateTasks(){ /* stuff*/ }
.Concat()
...
void MainTestApp() // Full sample available upon request.
{
List<string> nothingList = new List<string>();
nothingList.Add("whatever");
cts = new CancellationTokenSource();
delayedExecution =
from str in nothingList
select AccessTheWebAsync("", cts.Token);
delayedExecution2 =
from str in nothingList
select AccessTheWebAsync("1", cts.Token);
delayedExecution = delayedExecution.Concat(delayedExecution2);
}
/// SNIP
async Task AccessTheWebAsync(string nothing, CancellationToken ct)
{
// return a Task
}
var AllRunningDataTasks = results.ToList();
后面跟着这个代码:
while (AllRunningDataTasks.Count > 0)
{
// Identify the first task that completes.
Task<TableResult> firstFinishedTask = await Task.WhenAny(AllRunningDataTasks);
// ***Remove the selected task from the list so that you don't
// process it more than once.
AllRunningDataTasks.Remove(firstFinishedTask);
// TODO: Await the completed task.
var taskOfTableResult = await firstFinishedTask;
// Todo: (doen't work)
TrustState thisState = (TrustState)firstFinishedTask.AsyncState;
// TODO: Update the concurrent dictionary with data
// thisState.QueryStartPoint + thisState.ThingToSearchFor
Interlocked.Decrement(ref thisState.RunningDirectQueries);
Interlocked.Increment(ref thisState.CompletedDirectQueries);
if (thisState.RunningDirectQueries == 0)
{
thisState.TimeCompleted = DateTime.UtcNow;
}
}
最佳答案
要回答特定问题“什么逻辑上执行 IQueryable 到返回数据的东西”?这将是任何强制产生至少一个值或强制发现值是否可用的任何东西。
例如,ToList
, ToArray
, First
, Single
, SingleOrDefault
, 和 Count
将所有的力量评估。 (尽管 First
不会评估整个集合 - 它会检索第一个项目然后停止。)这些都必须至少开始检索值,因为它们中的任何一个都无法在不这样做的情况下返回它们返回的内容.在ToList
的情况下和 ToArray
,这些返回完全填充的非惰性集合,这就是为什么它们必须评估所有内容。返回单个项的方法至少需要请求第一项,以及 Single
然后,如果继续评估,将继续检查是否没有其他结果(如果结果更多,则抛出异常)。
使用 foreach
迭代查询也将强制评估。 (同样,出于同样的原因:您要求它从集合中获取实际值,因此它必须提供它们。)Concat
不会立即评估,因为它不需要 - 只有当您向串联序列询问一个值时,它才需要向其输入询问值。
顺便说一句,尽管您询问了 IQueryable
您没有在此处的示例中使用它。这可能很重要,因为与您实际获得的 LINQ to Objects 实现(您通过普通 IEnumerable<T>
获得)相比,它的工作方式存在一些差异。我认为这在这个例子中没有什么不同,但它让我想知道你的原始代码和你在这里发布的用于说明的版本之间是否有什么变化?这很重要,因为不同的 LINQ 提供程序可以以不同的方式做事。 IEnumerable<T>
flavor Concat
肯定使用延迟评估,虽然我希望这对于大多数其他 LINQ 实现是正确的,但它并不是绝对给定的。
如果你需要多次使用结果,并且你想确保你只对它们进行一次评估,但在你真正需要它们之前不评估它们,那么通常的方法是调用 ToList
在您肯定需要评估的地方,然后保留结果 List<T>
所以你可以再次使用它。一旦您获得了 List<T>
中的数据(或数组)形式,您可以根据需要多次使用该列表。
顺便说一下,你的第一个问题有一个问题:
“如何合并基于 TPL 的任务列表以供以后执行?”
通常,如果您已经有一个 TPL 任务,那么您无法阻止它执行。 (有一个异常(exception)。如果你直接构造一个 Task
而不是使用一种更正常的创建方式,它实际上不会运行,直到你告诉它。但一般来说,返回任务的 API 会返回活的,即,当您接触它们时,它们很可能已经在运行,甚至已经完成。)
您的示例中的“稍后执行”来自这样一个事实,即您实际上根本没有任务列表可以开始。 (如果您确实有 List<T>
个任务,“稍后执行”将不是一个选项。)您拥有的是几个可枚举,如果您要评估它们,将创建任务。创建任务的行为与在返回任务的任何 TAP 风格的 API 中启动它的行为是不可分割的。
根据您所写的其余内容,我认为您真正要问的是:
“如何将多个 IEnumerable<Task<T>>
对象合并为单个 IEnumerable<Task<T>>
,从而推迟对基础枚举的评估,直到对组合的枚举本身进行评估?”Concat
应该为此工作。
关于linq - 如何在不运行它们的情况下合并两个 Linq IEnumerable<T> 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13663470/
任何人都可以向我解释 IEnumerable 和 IEnumerator 之间的区别是什么, 以及如何使用它们? 谢谢!!! 最佳答案 通常,一个 IEnumerable是可以枚举的对象,例如列表或数
function TSomething.Concat(const E: IEnumerable>): IEnumerable; begin Result := TConcatIterator.Cr
我正试图找到解决这个问题的办法: 给定一个 IEnumerable> 我需要一个返回输入的方法/算法,但是如果多个 IEnumerable 具有相同的元素,则每个巧合/组只返回一个。 例如 I
我有一个有趣的问题:给定一个 IEnumerable , 是否有可能产生 IEnumerable> 的序列一次将相同的相邻字符串分组? 让我解释一下。 1。基本说明示例: 考虑以下 IEnumerab
我有课 public class Test { public void M1(IEnumerable> p) { } public void M2(IEnumerable)> p) {
我尝试解决下一个练习: 输入:整数列表 count >= 1;一些正整数 k 输出:此整数的所有可能元组,长度为 k ; 例如 输入: {1, 2}; k = 4 输出: { {1, 1, 1, 1
抱歉奇怪的标题。我想要实现的目标很简单: IEnumerable> listoflist; IEnumerable combined = listoflist.CombineStuff(); 例子:
公共(public)类项目 { ... public class Order { public List Items ... } public class Customer {
我有一个 IEnumerable>我想转换为单一维度集合的集合。是否可以使用通用扩展方法来实现这一点?现在我正在这样做以实现它。 List filteredCombinations = new Lis
我有一个 IEnumerable> CustomObject在哪里有一个 x (用作键(在本例中为 1 、 2 、 3 ))和 y值(value)。一些假数据: { { {1, 2}, {2, 4
我需要做的是选择嵌套元素列表,这是我的查询 returns IEnumerable>这是我的 linq 表达式: from a in (questions.Select(x => x.AnswerLi
如何使用 LINQ(或其他方式)将 IEnumerables 的 IEnumerable 拆分为一个平面 IEnumerable? 最佳答案 enumerable.SelectMany(x => x)
例如: public interface IEnumerable { IEnumerator GetEnumerator(); } //This interface allows the c
我对 Reflection.Emit 有疑问。我想要动态创建的类,它具有 ICollection 的简单实现。我定义的所有方法都很好,而不是接下来的两个: public IEnumerator Get
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why was IEnumerable made covariant in C# 4? 我正在查看 MSDN
IEnumerator.MoveNext() 的实现是否预计会相对较快?或者如果“移动到下一项” 包括磁盘 IO、Web 请求或其他可能长时间运行的操作是否可以? 例如,我正在处理一个处理文档的项目,
以下代码创建了 List 的中间实例并在 yield 返回之前将值附加到它。有没有一种好的方法可以避免创建实例并直接 yield 返回单元格值? IEnumerable> GetStrValues()
我有两个 IEnumerable 对象,我想验证其中一个是否包含另一个的所有元素。 我正在使用 obj1.Intersect(obj2).Any() 但交集没有像我预期的那样工作。即使 obj2 中只
我正在尝试这个 MSDN page 上的例子.我试图更改 GetEnumerator 方法。我知道那似乎有些不对劲,但它符合要求然后就不会运行。错误是枚举器尚未启动,应该调用 MoveNext,但 它
我写过关于自定义 IEnumerator 的文章。从中生成 IEnumerable 的最简单方法是什么?理想的解决方案(一行代码)是是否有一些用于该目的的类。还是我必须自己创建? 最佳答案 不幸的是,
我是一名优秀的程序员,十分优秀!