首页 > 解决方案 > 无法将类型 bool 隐式转换为 System.Threading.Tasks.Task

问题描述

我想遵循 msdn 上描述的异步等待结构here

所以我有一个async任务:

    public async void Starter()
    {

        CC = new CustomClass();

        Task<bool> newTask = CC.MethodThatReturnsBool();

        // DO SOME VISUAL THINGS

        bool b = await newTask;

        }
    }

但是我遇到了一个编译停止错误,CC.MethodThatReturnsBool();如我的问题标题所示。

如何以正确的格式获取我的布尔值?我尝试在错误的方法调用前随机转换(任务),但它只是从我的错误消息中删除了“隐式”!

我正在使用:

VS 社区 2017 和 .NET Framework 4.7

标签: c#asynchronous

解决方案


根据错误,这将返回bool

CC.MethodThatReturnsBool()

所以你会这样存储它:

bool newBool = CC.MethodThatReturnsBool();

这似乎意味着没有等待异步操作。简化:

public void Starter()
{
    CC = new CustomClass();

    bool b = CC.MethodThatReturnsBool();

    // do something with your bool?
}

目前尚不清楚您为什么期待await任何事情,并且确实可能​​还有更多您没有显示的内容,但是如果您调用的方法是同步的,则无需等待它。

旁注:async void是一个非常糟糕的主意。它的存在只是为了与 UI 事件处理程序等兼容。如果您正在编写任何您可以控制的内容,请不要使用async void.


编辑:

根据您对问题的更新,听起来这里发生的事情是您有一个长时间运行的同步进程,您不想阻塞 UI 线程?您可以将一些东西包装在 a 中Task,也许是这样的:

bool b = await Task.Run(() => new CustomClass().MethodThatReturnsBool());

所以也许总的来说你正在寻找更像这样的东西(未经测试)?:

public async Task Starter()
{
    Task<bool> newTask = Task.Run(() => new CustomClass().MethodThatReturnsBool());

    // DO SOME VISUAL THINGS

    bool b = await newTask;

    // do something with your bool?
}

要详细说明前一点,请注意整体方法现在async Taskasync void. 这使得Starter它自己可以等待,否则就不会是 void。

当然,理想情况下,如果它在内部执行导致其延迟的各种 I/O 绑定操作,则它本身MethodThatReturnsBool应该是。(正如您对上述问题的评论所暗示的那样。)这可能涉及在系统的其他地方进行重构,但从长远来看,这是更可取的方法。async


推荐阅读