我正在调用此方法:
Windows.Foundation.IAsyncOperation<AppServiceResponse> AppServiceConnection.SendMessageAsync(ValueSet message)
e.g。 await connection.SendMessageAsync(initialStatus);
它显示错误:'IAsyncOperation'不包含“GetAwaiter”的定义,并且没有扩展方法“GetAwaiter”接受类型为'IAsyncOperation'的第一个参数可以找到(你是否缺少'System'的using指令?)
然后我将其改为:
await Task.Run(() => connection.SendMessageAsync(initialStatus));
它被编译了。
我的第一个问题是为什么我不能等待SendMessageAsync?究竟是什么意思“没有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();
答案 0 :(得分:2)
我的第一个问题是为什么我不能等待SendMessageAsync?究竟是什么意思&#34;没有GetAwaiter的定义&#34;?
这意味着您错过了对System.Runtime.WindowsRuntime.dll
的引用。
然后我将其更改为[use
Task.Run
]它已编译。
是的,但它不会正常工作。正如迈克评论的那样,Task.Run
的返回类型为Task<IAsyncOperation<T>>
,等待时返回(不等待)实际的IAsyncOperation<T>
。因此,您只是在后台线程上启动操作,然后等待启动的操作 - 您不会等待完整
所以,你不应该写一个扩展方法。你根本不应该使用Task.Run
。只需添加缺少的参考,你应该没事。