【问题标题】:Linq query in background - something in PLINQ后台的 Linq 查询 - PLINQ 中的一些东西
【发布时间】:2011-03-04 20:22:43
【问题描述】:

是否有现成的东西可以在后台运行 Linq 查询 - 可能基于 PLINQ?我尝试了一些方法,但没有找到合适的方法。

我知道我可以创建一个后台工作人员来执行此操作,但我正在寻找“我可以使用”而不需要自己编写整个处理的东西。

总体情况:我尝试让我的 WinForm 应用程序在读取数据时保持反应性(通过 LINQ),并在读取大量数据时避免“阻塞”。

【问题讨论】:

    标签: linq .net-4.0 plinq


    【解决方案1】:

    您可以生成一个Task<T>,并让它包装您的 PLINQ 查询。

    PLINQ 不是关于创建异步操作(您想要什么),而是在单个(阻塞)操作中进行并发处理。相反,您可能想要执行以下操作:

    Task<IEnumerable<YourType>> task = Task.Factory.StartNew( 
           () => 
           {
               // Use standard LINQ here...
               return myCollection.Where(SomeCriteria);
           }
        );
    
    // When this is completed, do something with the results
    task.ContinueWith( t =>
    {
        IEnumerable<YourType> results = t.Result;
    
        // Use results here (on UI thread - no invoke required)
    
    }, TaskScheduler.FromCurrentSynchronizationContext());
    

    【讨论】:

    • 很好的例子,还有所有的细节。尤其是 TaskScheduler.FromCurrentSynchronizationContext() 值得注意,因为它继续原始线程,因此在更新 UI 时避免了跨线程异常(因此不需要 InvokeRequired 处理)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2010-09-06
    • 1970-01-01
    • 2020-09-28
    • 1970-01-01
    相关资源
    最近更新 更多