Task,await和ManagementObjectCollection

时间:2014-11-18 03:18:48

标签: c# winforms asynchronous lambda async-await

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

由于此错误,

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());
};

感谢您的帮助 丹尼

1 个答案:

答案 0 :(得分: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<ManagementObjectCollection>,即委派实例所分配的声明委托类型变量的返回类型。你得到的错误告诉你,lambda表达式返回的类型不同于表达式推断的委托类型(基于变量&#39; s类型)的类型。