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)以上の利点はありますか?
ありがとうございます。 3.引き続きデリゲートが添付される前にタスクが完了するとどうなりますか?それはまだ呼び出されますか?私は少し曖昧なドキュメントを探しています。 – GazTheDestroyer
はい、呼び出されます。 – dtb
例3の質問があります。SomeClientCode()がUIスレッド(WPF)で実行されている場合、OnWorkCompletedもUIスレッドにありますか?または、非同期作業を行った同じスレッドですか? –