2017-01-12 27 views
2

私はこのソフトウェアをC#でコーディングしています。このエラーメッセージが表示されます。私の人生にとって、私はそれを理解することはできません。私が何をしていても、何か役立つものを探しているわけではありません。あなたの問題はここにある'System.Threading.Tasks.Task'タイプを 'Windows.Foundation.IAsyncAction'に暗黙的に変換することはできません。明示的な変換が存在する

private async Task LoginIoTHub() 
{ 
    TypeJson command_json = new TypeJson(); 

    if (NowNetSta == false) return; 
    if (IoTHubConnectFlag == false) return; 

    if (TeamName == null) 
    { 
     Debug.WriteLine("Please don't let your team name be void when you call methods 'new IoTHubLocalService(xx,xx,xx)'"); 
     await Task.Delay(TimeSpan.FromSeconds(4)); 
    } 
    else 
    { 
     if (LoginF == false) 
     { 
      try 
      { 
       Debug.WriteLine("Start to login\r\n"); 

       LoginJson login_msg = new LoginJson(); 
       login_msg.DeviceID = BoardID; 
       login_msg.name = TeamName; 

       var messageString = JsonConvert.SerializeObject(login_msg); 

       command_json.Type = 1; 
       command_json.Command = messageString; 
       messageString = JsonConvert.SerializeObject(command_json); 

       var message = new Message(Encoding.ASCII.GetBytes(messageString)); 
       IAsyncAction Action = deviceClient.SendEventAsync(message); 

       await Action; 

       if (Action.Status == AsyncStatus.Completed) 
       { 
        Debug.WriteLine("Login success"); 
        LoginF = true; 
       } 
       else 
       { 
        Debug.WriteLine("Login failed"); 
        await Task.Delay(TimeSpan.FromSeconds(10)); 
       } 
      } 

      catch (Exception ex) 
      { 
       Debug.WriteLine("Login to IoT Hub failed, please check your team name and internet connection: " + ex.Message); 
       await Task.Delay(TimeSpan.FromSeconds(10)); 
      } 
     } 
    } 
} 
+0

を使用して完了を確認することができます。それは 'IAsyncAction Action = deviceClient.SendEventAsync(message);'あなたの問題だと推測しています。 – Nkosi

答えて

2

DeviceClient.SendEventAsync(Message)

デバイスのハブにイベントを送信します Task

を返します。

var Action = deviceClient.SendEventAsync(message); 
await Action; 

から

public Task SendEventAsync(Message message) 

変更コードは、タスクがあなたの例のようにIAsyncResultなくIAsyncActionから継承していることに注意してください。

また、エラーで何行Task.IsCompleted Property

if (Action.IsCompleted) { ... 
+0

これは部分的に動作しますが、if文もまた壊れます "Action.Status"が失敗(読み取り専用) == "は機能しません –

+0

すでに完了しているプロパティーを使用するように指示しました – Nkosi

+0

はい、ありました。謝罪いたします。長い一日だった。 –

0

コード自体

IAsyncAction Action = deviceClient.SendEventAsync(message); 

非同期メソッド呼び出しは、タスクを返します。 IAsyncActionsではありません。あなたの関数呼び出しdeviceClient.SendEventAsync(message)の戻り値を仮定し

は、あなたがこのようにコードを更新する必要がありTask<IAsyncAction>です:

IAsyncAction Action = await deviceClient.SendEventAsync(message); 

参考:https://msdn.microsoft.com/en-us/library/mt674882.aspx

+0

私はこれを試しました、それを信じるかどうか。"無効な型を 'Windows.Foundation.IASyncAction'に暗黙的に変換することはできません。 –

+0

@msammelsは私の更新された回答を参照してください;-) – Sebi

0

あなたの問題は、この行です:

IAsyncAction Action = deviceClient.SendEventAsync(message); 

SendEventAsync IAsyncActionが必要なタスクを返します。

IAsyncAction Action = deviceClient.SendEventAsync(message) as IAsyncResult; 

しかし、私はあなたがそれを待つために持っていることを意味その内側SendEventAsyncがTask<IAsyncAction>を返すと思う::明示的な変換が存在する場合は、次の操作を行うことができます

:あなたのコメントに基づいて

IAsyncAction Action = await deviceClient.SendEventAsync(message); 

私はこれを試してみましたか、それとも信じていません。これは、しかし、別のエラーがスローされます。 は、「暗黙的 『Windows.Foundation.IASyncAction』にタイプ 『無効』に変換できません

私はあなただけIAsyncActionを得ることはありませんよね、あなたがそれをしなければならないので。この方法:

await deviceClient.SendEventAsync(message); 
+0

私はちょうど自分自身のことを考えました! –

+0

@msammelsあなたの歓迎ですあなたのニーズに合った答えを受け入れるか、答えが役に立ったらアップアップしてください – Sebi

+0

別の問題が出てきました。 "await deviceClient"ソリューションを使うと、その下のif文が壊れます。さらに考えてみますか? –

関連する問題