2011-09-15 13 views
2

AndroidのSDKは、別のスレッドでコードを実行し、メイン(UI)スレッドで結果を取得できるようにするAsyncTaskクラスを備えています。要するに、このような何か:もちろんC#のAndroid AsyncTaskのような機能

class AsyncTask 
{ 
    void onPreExecute(...) 
    { 
     //Executed on the main thread BEFORE the secondary thread gets to work on anything. 
    } 

    void execute(...) 
    { 
     //This runs on the secondary thread. 
    } 

    void onPostExecute(...) 
    { 
     //This runs on the main thread AFTER the secondary thread finishes work. You get the result here in the form of some data type. 
    } 
} 

、これはただの荒いスキームですが、あなたはそれに慣れていない場合には、AsyncTaskに十分な情報を提供する必要があります。基本的には、私はMicrosoftの.NET Frameworkで同じ機能を探しています。

これを行うために自分のクラスで作業を始める前に、フレームワーク内で既に目的の結果を得ることができる何もないことを確認したいと思います。私は.NET 4.0を使用しています。おそらくSystem.Threading.Tasks.Taskの「巧妙な」使用のいくつかの並べ替え?私はこれをあなたに任せます。

要するに、関数に入力を渡し、セカンダリスレッドでコードを実行し、完了したら、メインスレッドを介していくつかのUI要素を更新します。メインスレッドを(たとえばTask.Wait()経由で)ロックすることは、自分の要件にはうまくいかない。

答えて

2

.NetのTaskクラスを使用して、あなたが探しているものを達成することができます。それは得るのを助ける必要があるよう

は、ここでは始め、いくつかのコードが見えるものです:YourMethodGoesHere()は、UIスレッドをオフに実行するようにスケジュールされます

var task = Task.Factory.StartNew(() => YourMethodGoesHere()); 

task.ContinueWith(t => UpdateYourUiInThisContinuation(), 
        TaskScheduler.FromCurrentSynchronizationContext()); 

task.ContinueWith(t => HandleAnExceptionWhichTheTaskMayThrow(), 
        TaskContinuationOptions.OnlyOnFaulted); 

。続行UpdateYourUiInThisContinuation()は、最初のタスクが完了した後に実行するようスケジュールされています。私が使用したオーバーロードは、同じ同期コンテキスト(このスレッドが最初にUIスレッドで呼び出されていると仮定してUIスレッド)

タスク内のコードがスローされる可能性のある例外を処理するには、最後の継続が推奨されます。それを処理しないと(この継続を使用する以外の方法があります)、処理されていないAggregateExceptionが発生します。

+0

ありがとうございます!これはトリックでした。代わりに私の関数で例外を処理しました。結果としてエラーメッセージを返すことは、私にとってもっと快適に思えます:) –

+0

これは 'publishProgress'インターフェースを実装していないようです。それと同等のものはどれですか? –

関連する問題