2016-05-11 8 views
1

This sample zeigt, wie eine Headless-App zu implementieren, die für mich auf Raspberry Pi funktionierte.So konfigurieren Sie Headless Windows IoT-Anwendungsprojekt zur Unterstützung von async/erwarten?

This sample zeigt eine App, die Task und async/await verwendet. Es läuft auch auf Raspberry Pi mit Null-Problem.

Allerdings, wenn ich eine Funktion mit async in seiner Unterschrift und den Rückgabetyp von Task zum kopflos App Projekt wie das hinzufügen:

public async Task Test() 
{ 
} 

Ich erhalte Kompilierungsfehler, die mich informiert, dass es nicht auf Windows-Runtime unterstützt:

error WME1038: Method 'BlinkyHeadlessCS.ReadMessagesFromDevice.ChangeDeviceMode()' has a parameter of type 'System.Threading.Tasks.Task' in its signature. Although this type is not a valid Windows Runtime type, it implements interfaces that are valid Windows Runtime types. Consider changing the method signature to use one of the following types instead: ''.

Von dieser Nachricht mache ich einen Schluss zu, dass der Grund, dass es, dass das Projekt Ausgabetyp nicht kompiliert ist WinRT ist. Aber ich würde gerne wissen, wie das Projekt richtig zu konfigurieren, so dass es ähnlich wie das Beispiel funktioniert?.

Insbesondere möchte ich die Funktion in dem obigen Beispiel erfolgreich kompilieren und arbeiten, wie es in dem Kopf Probe hinzugefügt wird.


Was ich bisher versucht:

  1. Changed die Projektausgabe auf die einzige andere Option in der Dropdown-Liste: "Klassenbibliothek". Fehlgeschlagen Kompilation mit diesem Fehler:

error : One of your dependencies requires the .NET Framework, but the .NET Framework could not be found in the NuGet packages installed in this project. Please install the appropriate .NET Framework packages required by your dependency.

Ich bin mir nicht sicher, was „angemessen nuget Pakete“ diese Fehlermeldung möglicherweise beziehen könnte. Ich bin mir auch nicht sicher, ob "Klassenbibliothek" der richtige Ausgabetyp ist.

  1. Es wurde versucht, die Benutzeroberfläche aus dem zweiten Beispiel zu entfernen. Fehlgeschlagen Kompilation mit dem folgenden Fehler:

error CS5001: Program does not contain a static 'Main' method suitable for an entry point

  1. Versucht, eine leere Haupt in der App hinzufügen. Deployment schlug mit dem folgenden Fehler:

Error DEP0001 : Unexpected Error: -2145615869

+1

Ist Ihr Asynchron-Methode public, und tut es sein? IIRC, es gibt Einschränkungen, was Sie in WinRT * öffentlich machen können *, aber Sie sollten in der Lage sein * intern * async/gate zu verwenden. Es ist ein wenig verwirrend, da Sie nicht wissen, wie sehr das Problem damit zu tun hat, dass Sie eine 'Main'-Methode verwenden, anstatt den richtigen Projekttyp auszuwählen, anstatt Async zu verwenden. Ich würde versuchen, es auf ein * Problem zu setzen. Erhalte etwas Einfaches ohne Async und führe dann eine Async-Methode ein. –

+0

@JonSkeet, danke für das Einspielen. Ich entschuldige mich, dass meine Frage nicht klar zu lesen ist. Die wichtigsten Punkte sind: 1) Headless-App funktioniert, aber der Ausgabetyp WinRt weigert sich so etwas zu kompilieren mit Aufgabe 2) headed funktioniert perfekt mit [.NET für UWP-Apps] (https://msdn.microsoft.com/en-us/ library/windows/apps/xaml/mt185501.aspx) 3) Probleme beim Einrichten des Projekts ohne Kopf, das .NET für UWP-Apps verwenden würde Task ' –

+1

Das hat meine Frage, ob die Methode öffentlich ist oder nicht, nicht beantwortet - und es gibt einen großen Unterschied zwischen "keine asynchrone Methode zulassen" und "sich weigern, etwas mit der Aufgabe zu kompilieren". –

Antwort

0

ich WinRT nicht verwenden, aber ich bin mir ziemlich sicher, dass Sie nicht Tasks in es benutzen sollen.

Von diesem Blog:

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

Sieht aus wie für async erwarten in WinRT, müssen Sie Ihre Rückgabetypen übersetzen:

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

Die gemeinsame von Task-implementierte Schnittstelle und die WinRT Äquivalente ist IASyncResult, wie Sie vielleicht erwarten.

+0

Ich will * WinRt nicht benutzen. Das zweite Beispiel, das ich verlinke, verwendet Tasks und es läuft auf WindowsIoT/Raspberry Pi. Ich möchte das Gleiche tun. Die WinRT-Route zu gehen ist sicherlich eine Richtung, die ich vermeiden möchte. –

+0

Ich bestätige auch in der Frage, dass der WinRT-Ausgabetyp falsch ist. –

+0

@zesspri - ob Sie WinRT verwenden möchten ist irrelevant für die Verwirrung, die es verursacht hat. Fix die Methodensignaturen und die Verwirrung über den ersten Fehler in Bezug auf Aufgaben ist aufgeklärt und der Rest sollte Ihnen klar werden. – hoodaticus

1

Führen Sie Folgendes aus.

Install-Package Nito.AsyncEx 

Dann gehen Sie wie folgt in Ihrem Code

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

    private async Task MainImpl() 
    { 
     //Do stuff. 
    } 
} 
+0

@zespri In diesem Fall würde ich vorschlagen, dass Sie Stephen Cleary direkt kontaktieren, um seine Bibliotheken UWP kompatibel zu machen. Ich denke, er wäre mehr als glücklich, es zu versuchen. – Aron

+0

Wie bekomme ich 'IBackgroundTaskInstance' dann? Ich muss [GetDeferral] (https://msdn.microsoft.com/library/windows/apps/hh700507) darauf aufrufen, damit die Laufzeit die App nicht beendet, wenn die Hauptmethode beendet ist. –

+0

@zesspri 'Main' wird nicht beendet, bis 'MainImpl' beendet ist. Also "erwarte" einfach deine 'IBackgroundTaskInstance' in deinem' MainImpl'. – Aron