2013-08-16 12 views
8

Xamarin releasedasync/awaitのサポートにより、モバイルプラットフォームでの反応性UIの開発が大幅に簡素化されます。私はそれを利用して、今からasync/awaitを使ってコードのプログラミングレベルを上げたいと思っています。しかしC#/ MonoTouch:ViewControllerの作成時に非同期メソッドを呼び出す方法

、私はC#に比較的新しいだと私は私がasyncメソッドを呼び出すことができます私のコードの「フック」を見つけるためにトラブルを抱えている前async/await使用していないので。私は、そのイベントハンドラが(IOCが起こる)、典型的な場所である知っているが、次のシナリオを想像:

私はViewControllerををロードされたときにバックグラウンドタスクを開始したい(ボタンが押したときではなく) 。明らかに

async Task PerformMyTaskAsync() 
{ 
    // ... 
    await ... // another async API 
    // ... 
} 

public override void ViewDidLoad() 
{ 
    base.ViewDidLoad(); 

    // .. initialize UI 
    await PerformMyTaskAsync(); 
} 

ViewDidLoadは、非同期メソッドやイベントハンドラでもないので、私はViewDidLoadPerformMyTaskAsyncのために待つことができません。

ビューコントローラが読み込まれる(または表示される)ときに、バックグラウンドタスクを開始する「代替」アプローチとは何ですか?

+0

非同期のミゲルによってウェビナーをチェックhttp://blog.xamarin.com/csharp-async-on-ios-and-android/ –

+0

私は昨日のライブ、それを見ました。そのような素晴らしい説明はミゲルによって行われましたが、私が求めていることを正確にカバーしていません。とにかくリンクに感謝します。 –

答えて

17

最新のXamarin Stable Channelリリースは、ViewController LifecycleメソッドのAsync/Awaitオーバーロードをサポートしています。試してみてください:

public async override void ViewDidLoad() 
+0

私はそれを知らなかったので、私の問題は解決されました! –

+0

そして、非同期の場合にメソッドがvoidを返すべきでないという警告はどうでしょうか? – Chucky

+0

@Chucky通常、多くの問題を避けるために非同期メソッドからvoidを返すことは決してありません。したがって、警告です。唯一の例外はイベントハンドラと、この場合はライフサイクルメソッドです(この場合、警告を無視しても問題ありません)。 try-catchで非同期のvoid内にコードをラップするようにしてください。 – Seafish

1

これが「最良の」アプローチであるかどうかはわかりませんが、ViewDidLoad()内からイベントを発生させてから、そのイベントのハンドラで非同期コードを起動しようとしましたか?

+0

すてきな回避策のように見えますが、他のコードでこれをやっているのを見たことはありませんが、これはパターンになるかもしれません。 –

関連する問題