2017-02-20 6 views
0

非同期メソッドがあり、UIAlertViewを表示する非同期メソッドを呼び出す必要があります。この非同期メソッドは、ボタンがクリックされた場合にintを返します。Xamarin iOS戻り値を同期して実行するタスク

public Task<int> ShowAlertAsync(string title, string message, params string[] buttons) 
    { 
     var tcs = new TaskCompletionSource<int>(); 

     var alert = new UIAlertView 
     { 
      Title = title, 
      Message = message 
     }; 

     if (buttons.Length > 0) 
     { 
      foreach (var button in buttons) 
      { 
       alert.AddButton(button); 
      } 
     } 
     else 
     { 
      alert.AddButton("OK"); 
     } 

     alert.Clicked += (s, e) => { tcs.TrySetResult((int)e.ButtonIndex); }; 
     alert.Show(); 

     return tcs.Task; 
    } 

私は非同期メソッドからこれを呼び出す場合、これは正常に動作しますが、問題は、私は間違いなく非同期に変換することができない同期方法を持っているということですので、私は、このメソッドを呼び出す必要があります同期的な方法で応答を待ちます。 syncメソッドは結果を取得した後、実行を続行する必要があります。

私はMainThreadをコンパイルまたはブロックしなかった多くのソリューションを試しましたが、UIAlertViewは表示されません。

おそらく誰かが私がこれをやり遂げる方法を知っているのでしょうか、それとももっと良い解決策があるかもしれません。

ありがとうございます!

答えて

1

可能な解決策は、ContinueWithを使用することです。例えば

ShowAlertAsyc("title","message",...).ContinueWith(t=> 
{ 
    //t.Result contains the return value 
}); 

あなたは残念ながら、タスクが完了するまで、これは待機しませんも、それは示していますが、ContinueWith方法

ShowAlertAsyc("title","message",...).ContinueWith(t=> 
{ 
    //t.Result contains the return value 
}, TaskScheduler.FromCurrentSynchronizationContext()); 
+0

を拡張することができますよりも、現在のコンテキストを使用する必要がある場合UIAlertView –

+0

ShowAlertAsyncを呼び出す非同期メソッドで質問を拡張できますか? –

+0

私はすべてのメソッドを非同期に変換し、非同期に変換できなかったメソッドを再実装しました。 –

関連する問題