1

这个示例展示了如何实现一个无头应用程序,它在 Raspberry Pi 上对我有用。

此示例显示了一个使用Task和 async/await 的应用程序。它还可以在 Raspberry Pi 上以零问题运行。

但是,当我向无头应用程序项目添加一个带有async签名和返回类型的函数时Task,如下所示:

public async Task Test() 
{
}

我收到编译错误,通知我 Windows 运行时不支持它:

错误 WME1038:方法“BlinkyHeadlessCS.ReadMessagesFromDevice.ChangeDeviceMode()”在其签名中有一个“System.Threading.Tasks.Task”类型的参数。尽管此类型不是有效的 Windows 运行时类型,但它实现的接口是有效的 Windows 运行时类型。考虑将方法签名更改为使用以下类型之一:''。

从这条消息中我得出一个结论,它无法编译的原因是项目输出类型是 WinRT。但我想知道如何正确配置项目,使其行为类似于标题示例的作用

具体来说,我希望上面示例中的函数能够成功编译并像添加到带头示例中那样工作。


到目前为止我尝试了什么

  1. 将项目输出更改为下拉列表中唯一可用的其他选项:“类库”。编译失败并出现此错误:

错误:您的依赖项之一需要 .NET Framework,但在此项目中安装的 NuGet 包中找不到 .NET Framework。请安装您的依赖项所需的适当 .NET Framework 包。

我不确定此错误消息可能指的是什么“适当的 nuget 包”。我也不确定“类库”是否是正确的输出类型。

  1. 试图从第二个示例中删除 UI。编译失败,出现以下错误:

错误 CS5001:程序不包含适用于入口点的静态“Main”方法

  1. 试图在应用程序中添加一个空的 Main。部署失败,出现以下错误:

错误 DEP0001:意外错误:-2145615869

4

3 回答 3

1

运行以下。

Install-Package Nito.AsyncEx

然后在您的代码中执行以下操作

public static class Program
{
    public int static Main()
    {
        AsyncContext.Run(MainImpl);
    }

    private async Task MainImpl()
    {
        //Do stuff.
    }
}
于 2016-05-11T05:59:54.330 回答
1

在方法中使用 internal 修饰符而不是 public

于 2019-06-14T04:33:30.433 回答
0

我不使用 WinRT,但我很确定您不应该在其中使用任务。

从这个博客:

https://blogs.msdn.microsoft.com/windowsappdev/2012/06/14/exposing-net-tasks-as-winrt-asynchronous-operations/

看起来对于 WinRT 中的异步等待,您需要转换您的返回类型:

void => AsyncActionCompletedHandler
Task => AsyncActionWithProgressCompletedHandler<TProgress>
Task<TResult> => AsyncOperationWithProgressCompletedHandler<TResult, TProgress>

正如您所料,Task 和 WinRT 等效项实现的通用接口是 IASyncResult。

于 2016-05-11T05:33:43.897 回答