2011-11-23 11 views
39

this questionに続いて、TPLを使用して非同期メソッドを実装しようとしていて、TAPガイドラインに従おうとしています。タスクベースの非同期メソッドのコールバックを定義する場所

私の非同期メソッドは、終了時にコールバックを実行する必要があります。私が見る限り、これを行うには3つの方法があります。私のタスクのデリゲートで手動

1)コールバック

public Task DoWorkAsync(DoWorkCompletedCallback completedCallback) 
{ 
    return Task.Factory.StartNew(
    { 
     //do work 

     //call callback manually 
     completedCallback(); 
    }); 
} 

2)、呼び出し元に

public Task DoWorkAsync() 
{ 
    return Task.Factory.StartNew(
    { 
     //do work 
    }); 
} 

public void SomeClientCode() 
{ 
    Task doingWork = DoWorkAsync(); 
    doingWork.ContinueWith(OnWorkCompleted); 
} 

をタスクにコールバックを割り当てます)タスクデリゲートに

public Task DoWorkAsync(DoWorkCompletedCallback completedCallback) 
{ 
    return Task.Factory.StartNew(
    { 
     //do work 
    } 
    ).ContinueWith(completedCallback); //assign callback to Task 
} 

3をタスクにコールバックを割り当てます。私の直感は、メソッドからコールバックを切り離すので、3がより正しいことです。クライアントコードは、タスクがすべてのものであるように思われる(コールバック、ポーリングなどを使用して)どのような方法でもタスクを管理できます。しかし、DoWorkAsync()がクライアントコードがそのコールバックをフックする前に作業を完了するとどうなりますか?

これを行うには一般に認められた方法がありますか、それは新しいものですか?

2)1)以上の利点はありますか?

答えて

28

一般的に受け入れられている方法は、TPLの3

ユーザーは、一般的に、彼らはContinueWithでタスクを継続することができることを知っています。 1と2は同じ機能を提供しますが、非標準インタフェースを備えています。デリゲートパラメータが何を意味し、何を通過させるかをユーザが把握しなければならない。彼らが続行したくない場合は、すべての方法は、標準的な方法で続けることができるタスクを返します。

+4

ありがとうございます。 3.引き続きデリゲートが添付される前にタスクが完了するとどうなりますか?それはまだ呼び出されますか?私は少し曖昧なドキュメントを探しています。 – GazTheDestroyer

+3

はい、呼び出されます。 – dtb

+0

例3の質問があります。SomeClientCode()がUIスレッド(WPF)で実行されている場合、OnWorkCompletedもUIスレッドにありますか?または、非同期作業を行った同じスレッドですか? –

関連する問題