Per*_*erg 3 .net c# async-await c#-5.0
(问题的真正标题应该是"为什么我得到一个'无法播放'System.Runtime.CompilerServices.TaskAwaiter`1 [System.Runtime.CompilerServices.VoidTaskResult]'类型的对象'来键入'System.Runtime.CompilerServices .INotifyCompletion'",但遗憾的是这对StackOverflow来说太长了.:)
嗨,
在尝试await执行我的方法时,我遇到了非常奇怪的问题.调用代码看起来像这样(摘录):
private async Task DownloadAddonFileAsync(dynamic addon, dynamic file, string targetFolder)
{
// ...
await DownloadFileAsync(file, targetFolder, uri);
Run Code Online (Sandbox Code Playgroud)
DownloadFileAsync看起来像这样:
protected async Task DownloadFileAsync(dynamic file, string targetFolder, string uri)
{
// ...
var fileBytes = await AppLoaderRestClient.GetAsync<byte[]>(uri);
Run Code Online (Sandbox Code Playgroud)
反过来,AppLoaderRestClient.GetAsync()看起来像这样:
public static async Task<T> GetAsync<T>(string uri)
{
// ...
if (typeof (T) == typeof (byte[]))
{
var result = await webClient.DownloadDataTaskAsync(uri);
return (T) (object) result;
}
Run Code Online (Sandbox Code Playgroud)
因此,这里实际上有一系列任务 - "内部"任务将是一个任务,然后将其传播到调用者,并转换为任务(即没有结果的任务).我认为这可能导致手头的问题?
如果我将最外面的代码更改为:
var task = DownloadFileAsync(file, targetFolder, uri);
task.Wait();
Run Code Online (Sandbox Code Playgroud)
......它完美无瑕.为什么?
Per*_*erg 12
有时候结果是,我在这里发布时设法找到问题的答案.以为我会分享它以避免让别人头疼...
这个问题源于我使用动态,或者更确切地说,(在我看来)C#/ .NET中的动态作品略有限制和破碎.如果我像这样重新编写代码:
await (Task)DownloadFileAsync(file, targetFolder, uri);
Run Code Online (Sandbox Code Playgroud)
......它完美无瑕.
这里的事情是,由于我的一个参数(dynamic是动态的),这将是一个动态操作.并且返回值似乎以某种方式"混乱"来自动态操作; CLR根本无法从上面的代码中推断出该方法是返回dynamic还是file(或者我猜).因此,它无法尝试将结果转换为INotifyCompletion实例 - 因此,异常.
非常感谢很多,微软.;)
(我认为这里的主要问题是异常消息非常不清楚,在我看来......)
| 归档时间: |
|
| 查看次数: |
1418 次 |
| 最近记录: |