public class TestClass
{
public TestClass(int id, string name)
{
Name = name;
Id = id;
}
public string Name
{ get; private set; }
public int Id
{ get; private set; }
public string Tag
{ get; set; }
public DateTime Time
{ get; set; }
}
private static void Main(string[] args)
{
List<TestClass> list = new List<TestClass>();
for (int i = 0; i < 5; i++ )
{
TestClass t = new TestClass(i, Guid.NewGuid().ToString());
t.Tag = i%2 == 0?"Hello":"World";
list.Add(t);
}
var query = list
.GroupBy(l=>l.Tag);
Func<IEnumerable<IGrouping<string, TestClass>>, int[]> func = GetIds<string,TestClass>;
func.BeginInvoke(query, null, null);
Console.Read();
}
private static int[] GetIds<T, U>(IEnumerable<IGrouping<T, U>> query)
{
List<int> ints = new List<int>();
foreach(var y in query)
ints.Add(y.Count());
return ints.ToArray();
}
}
我知道LINQ在迭代集合之前不会执行,但我只是想确保即使将查询传递给另一个异步方法,我也可以认为它仍然成立。
答案 0 :(得分:16)
是的,查询执行仍然是延期的。该查询只是对IEnumerable<T>
实现的引用,IEnumerable<T>
实现了另一个{{1}}(以及适当的代理进行过滤,分组等)。
请注意,如果您再次迭代它(在任何线程中)将再次执行查询。查询引用知道如何获取数据 - 它不知道数据本身。
答案 1 :(得分:3)
据我了解,它仍将异步保持为真,但执行可能不是线程安全的。例如,LINQ to SQL的DataContexts不是线程安全的,因此LINQ to SQL查询不应该以这种方式在另一个线程中执行。
答案 2 :(得分:1)
当您致电ints.ToArray();
时执行它并不重要,因为它在另一个线程中......
编辑:我立即纠正,它会在ForEach中执行......
答案 3 :(得分:1)