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

时间:2017-02-25 00:45:08

标签: c# generics async-await task extension-methods

我正在调用此方法: 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();

的内容

1 个答案:

答案 0 :(得分:2)

  

我的第一个问题是为什么我不能等待SendMessageAsync?究竟是什么意思&#34;没有GetAwaiter的定义&#34;?

这意味着您错过了对System.Runtime.WindowsRuntime.dll的引用。

  

然后我将其更改为[use Task.Run]它已编译。

是的,但它不会正常工作。正如迈克评论的那样,Task.Run的返回类型为Task<IAsyncOperation<T>>,等待时返回(不等待)实际的IAsyncOperation<T>。因此,您只是在后台线程上启动操作,然后等待启动的操作 - 您不会等待完整

所以,你不应该写一个扩展方法。你根本不应该使用Task.Run。只需添加缺少的参考,你应该没事。