我可以为 运行 任务编写通用扩展方法吗?

Can I write generic extension method to run task?

我正在调用这个方法: Windows.Foundation.IAsyncOperation<AppServiceResponse> AppServiceConnection.SendMessageAsync(ValueSet message)

例如await connection.SendMessageAsync(initialStatus);

它显示错误:'IAsyncOperation' 不包含 "GetAwaiter" 的定义,并且找不到接受类型 'IAsyncOperation' 的第一个参数的扩展方法 "GetAwaiter"(您是否缺少 'System' 的 using 指令?)

那我改成:

await Task.Run(() => connection.SendMessageAsync(initialStatus));

已编译。

我的第一个问题是为什么我不能将 await 应用到 SendMessageAsync? "no definition for GetAwaiter" 到底是什么意思?

我的第二个问题是我还需要运行其他方法 例如Windows.Foundation.IAsyncOperation<AppServiceConnectionStatus> AppServiceConnection.OpenAsync()

我写一个扩展方法:

public static async void AsTask(this IAsyncOperation<AppServiceResponse> operation)
{
    await Task.Run(() => operation);
}

所以我可以调用 connection.SendMessageAsync(initialStatus).AsTask(); 但是我可以使扩展方法通用所以我也可以调用 connection.OpenAsync().AsTask();

My first question is why I cannot apply await to SendMessageAsync? What exactly does it mean "no definition for GetAwaiter"?

这意味着您缺少对 System.Runtime.WindowsRuntime.dll 的引用。

Then I change it to [use Task.Run] It got compiled.

是的,但它不能正常工作。正如迈克评论的那样,这里 Task.Run 的 return 类型是 Task<IAsyncOperation<T>>,等待时 return (不是等待)实际IAsyncOperation<T>。所以你只是 starting 后台线程上的操作,然后等待该操作到 start - 你不是在等待它 完成.

所以,您不应该编写扩展方法。你根本不应该在这里使用 Task.Run 。只需添加缺少的参考,你应该没问题。