gpt4 book ai didi

c# - 为什么在等待任务返回方法时出现 InvalidCastException?

转载 作者:行者123 更新时间:2023-11-30 13:26:41 28 4
gpt4 key购买 nike

(问题的真正标题应该是“为什么我得到一个‘无法转换类型为‘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);

DownloadFileAsync 如下所示:

    protected async Task DownloadFileAsync(dynamic file, string targetFolder, string uri)
{
// ...
var fileBytes = await AppLoaderRestClient.GetAsync<byte[]>(uri);

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;
}

所以,这里实际上有一个任务的 - “内部”任务将是一个任务,然后将传播到调用者,并转换为一个任务(即一个任务没有结果)。我认为这可能会导致手头的问题?

如果我把最外层的代码改成这样:

        var task = DownloadFileAsync(file, targetFolder, uri);
task.Wait();

...它完美无缺。为什么?

最佳答案

事实证明,我在此处发布问题时设法找到了问题的答案。以为我会分享它以防止其他人头痛......

问题源于我对 dynamic 的使用,或者更确切地说,(在我看来)稍微有限和 splinter 的方式dynamic目前在 C#/.NET 中工作。如果我这样改写我的代码:

await (Task)DownloadFileAsync(file, targetFolder, uri);

...它完美地工作。

这里的事情是因为我的参数之一( filedynamic ),这将是一个动态操作。并且返回值似乎在某种程度上被动态操作“搞砸了”; CLR 根本无法从上面的代码中推断出该方法是否返回 Task。或 Task<T> (或者我猜)。因此,它无法尝试将结果转换为 INotifyCompletion。实例 - 因此,异常。

非常感谢,微软。 ;)
(我认为这里的主要问题是异常消息非常不清楚,在我看来......)

关于c# - 为什么在等待任务返回方法时出现 InvalidCastException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19157258/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com