我可以为 运行 任务编写通用扩展方法吗?
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
。只需添加缺少的参考,你应该没问题。
我正在调用这个方法:
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
。只需添加缺少的参考,你应该没问题。