【问题标题】:Task, await and ManagementObjectCollection任务、等待和 ManagementObjectCollection
【发布时间】:2014-11-18 03:18:48
【问题描述】:

我正在尝试使用 Lambda 表达式发现所有连接到系统的逻辑磁盘,该表达式使用 await 关键字来异步执行函数。一切似乎都很好,除了退货声明。

return(Search.Get()); 无法编译,因为这个错误:

“无法将 lambda 表达式转换为委托类型 'System.Func>',因为块中的某些返回类型不能隐式转换为委托返回类型 (CS1662) - D:\PugApplications\Pug_AdvancedControls\Pug_AdvancedControls\Pug_FileSystemTree\ Pug_FileSystemNode.cs:34,14

我该怎么做?我读过的所有内容都表明这应该有效。

Pug_DriveType 只是我为反映 Win32 DriveType 枚举而编写的一个枚举。

// 读取驱动器

Func<Pug_DriveType, Task<ManagementObjectCollection>> ReadTask = (Pug_DriveType DT) =>
{

    StringBuilder Query =
        new StringBuilder("SELECT * FROM Win32_LogicalDisk WHERE DriveType=\"")
        .Append((int)DT).Append("\"");

    ManagementObjectSearcher Search = new ManagementObjectSearcher(Query.ToString());

    return (Search.Get());
};

感谢您的帮助 丹尼

【问题讨论】:

    标签: c# winforms asynchronous lambda async-await


    【解决方案1】:

    我想你想要更多这样的东西:

    Func<Pug_DriveType, Task<ManagementObjectCollection>> ReadTask = async (Pug_DriveType DT) =>
    {
    
        StringBuilder Query =
            new StringBuilder("SELECT * FROM Win32_LogicalDisk WHERE DriveType=\"")
            .Append((int)DT).Append("\"");
    
        ManagementObjectSearcher Search = new ManagementObjectSearcher(Query.ToString());
    
        return await Task.Run(() => Search.Get());
    };
    

    或者可能:

    Func<Pug_DriveType, Task<ManagementObjectCollection>> ReadTask = (Pug_DriveType DT) =>
    {
    
        StringBuilder Query =
            new StringBuilder("SELECT * FROM Win32_LogicalDisk WHERE DriveType=\"")
            .Append((int)DT).Append("\"");
    
        ManagementObjectSearcher Search = new ManagementObjectSearcher(Query.ToString());
    
        return Task.Run(() => Search.Get());
    };
    

    (取决于您最终可能会在那里放入匿名方法。)

    以上任何一种情况都会导致您的匿名方法返回Task&lt;ManagementObjectCollection&gt;,即分配了委托实例的声明委托类型变量的返回类型。您收到的错误是告诉您 lambda 表达式返回的类型不同于为表达式推断的委托类型(基于变量的类型)。

    【讨论】:

    • 嗨,彼得。感谢您的回复。在 lambda 表达式下,我正在执行 Results = await ReadTask(DType);对于每个驱动器类型,然后将结果添加到 TreeView。我看不出你的回答会有什么帮助。您能否添加更多解释。谢谢你
    • Peter 我刚刚尝试了您的两个示例,但都未能编译返回“所有代码路径都无法返回值”错误。不过还是谢谢。
    • 抱歉……打错了。省略了实际的 return 关键字。
    • 是的,它现在可以工作了,彼得。谢谢大家好。我自己应该知道的。
    • 我还添加了一个解释,希望能更清楚地说明为什么这些版本的 lambda 可以工作,而原始版本不能工作。希望有帮助!
    猜你喜欢
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多