C# 任务、等待和ManagementObjectCollection

C# 任务、等待和ManagementObjectCollection,c#,winforms,asynchronous,lambda,async-await,C#,Winforms,Asynchronous,Lambda,Async Await,我试图使用Lambda表达式发现连接到系统的所有逻辑磁盘,该表达式使用wait关键字异步执行函数。除了返回站外,一切似乎都很好 return(Search.Get())未编译: 无法将lambda表达式转换为委托类型“System.Func>”,因为块中的某些返回类型不能隐式转换为委托返回类型(CS1662)-D:\pugaapplications\Pug\u AdvancedControls\Pug\u AdvancedControls\Pug\u FileSystemTree\Pug\u F

我试图使用Lambda表达式发现连接到系统的所有逻辑磁盘,该表达式使用wait关键字异步执行函数。除了返回站外,一切似乎都很好

return(Search.Get())未编译:

无法将lambda表达式转换为委托类型“System.Func>”,因为块中的某些返回类型不能隐式转换为委托返回类型(CS1662)-D:\pugaapplications\Pug\u AdvancedControls\Pug\u AdvancedControls\Pug\u FileSystemTree\Pug\u 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());
};
Func ReadTask=(Pug_DriveType DT)=>
{
StringBuilder查询=
新建StringBuilder(“从Win32\u LogicalDisk中选择*,其中DriveType=\”)
.Append((int)DT.Append(“\”);
ManagementObjectSearcher Search=新的ManagementObjectSearcher(Query.ToString());
return(Search.Get());
};
谢谢你的帮助
丹尼

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

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 ReadTask=async(Pug_DriveType DT)=>
{
StringBuilder查询=
新建StringBuilder(“从Win32\u LogicalDisk中选择*,其中DriveType=\”)
.Append((int)DT.Append(“\”);
ManagementObjectSearcher Search=新的ManagementObjectSearcher(Query.ToString());
返回等待任务。运行(()=>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());
};
Func ReadTask=(Pug_DriveType DT)=>
{
StringBuilder查询=
新建StringBuilder(“从Win32\u LogicalDisk中选择*,其中DriveType=\”)
.Append((int)DT.Append(“\”);
ManagementObjectSearcher Search=新的ManagementObjectSearcher(Query.ToString());
返回Task.Run(()=>Search.Get());
};
(这取决于你可能会在匿名方法中添加的其他内容。)


上述任一情况都会导致匿名方法返回
任务
,该任务是已声明的委托类型变量(委托实例已分配给该变量)的返回类型。您收到的错误是,lambda表达式返回的类型与所推断的委托类型不同(基于变量的类型)用于表达式。

Hi Peter。感谢您的响应。在lambda表达式下,我正在执行Results=wait ReadTask(DType);然后将结果添加到树视图中。我看不出你的答案会有什么帮助。你能添加更多解释吗。谢谢彼得,我刚刚尝试了你的两个示例,两个示例都未能编译并返回“所有代码路径均未能返回值”“错误。谢谢。抱歉……输入错误。遗漏了实际的
return
关键字。是的,它现在可以工作了,彼得。非常感谢。我本应该自己学习的。我还添加了一个解释,希望能更清楚地解释为什么lambda的这些版本可以工作,而原始版本不能。希望这能有所帮助!”!