2017-08-25 8 views
0

IoT用のVS2017テンプレートを使用してラズベリーパイで実行するUWPバックグラウンドアプリを作成しています。私は非同期メソッドにアクセスする必要があるので、アプリケーションはシリアルポート上のArduinoからのデータをリッスンします。UWPでの非同期コールバックグラウンドアプリケーション

コンパイルするコードを取得する唯一の方法は、私の非同期 "Listen()"メソッドの戻り値の型をvoidにすることですが、Run()メソッドのListen() FromIdAsync()に到達するとブロックされます。戻り値の型Task, or Task<T>をしようとすると

public async void Run(IBackgroundTaskInstance taskInstance) 
    { 
     // Create the deferral by requesting it from the task instance. 
     BackgroundTaskDeferral deferral = taskInstance.GetDeferral(); 
     ListenAsync(); 
     deferral.Complete(); 
    } 

    private async void ListenAsync() 
    { 
     // some more code..... 
     serialPort = await SerialDevice.FromIdAsync(deviceID); 
    } 

私は、コンパイラのエラーを取得:

Severity Code Description Project File Line Suppression State 
Error  Method 'RMSMPBackgroundApp.StartupTask.ListenAsync()' 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: ''. RMSMPBackgroundApp C:\Users\Dan.Young\documents\visual studio 2017\Projects\RMSMPBackgroundApp\RMSMPBackgroundApp\StartupTask.cs 41 

をいくつかの記事が示唆するように私も聞く()メソッドをプライベートにすることを試みました。

私は非同期プログラミングに比較的新しいので、何か明白なものを紛失していなければなりませんか?

ありがとうございました。

答えて

0

私は同様の状況に遭遇し、バックグラウンドタスクに存在するクラスでタスク戻り値の型を使用できることが分かりました。これを実行するために、我々はTask<YourCustomClass>で既存のメソッドを呼び出しますIAsyncOperation<YourCustomClass>の戻り値の型を持つメソッドを追加する必要があります。あなたのRun()方法から

public IAsyncOperation<YourCustomClass> getDataAsync() 
{ 
    return LoadPositionDataAsync().AsAsyncOperation(); 
    //where LoadPositionDataAsync() has a return type of Task<YourCustomClass> 
} 

をあなたは...あなたのコードを実行する

getDataAsync()を呼び出すことができます
+0

しかし、これは私のために働いていません。私はまだタスクが有効なWindowsランタイムタイプではないというエラーを受け取ります。 runメソッドと 'using'ステートメントを含むコード全体を提供して、何か不足しているかどうかを確認できますか?ありがとう。 –

関連する問題