タスク スケジューラに関する最近の MSDN Magazine の記事を読んだ後、それを使用すると、WCF で生成されたプロキシを使用するメリットがあることを期待していました (そして実際には非常に興奮していました)。
私は次の利点のいくつかを得たいと思っていました:
- 1) 実行中の WCF 操作を中止する機能(サーバー上で操作を停止することは期待していません。「このタスクの結果は必要ありません」というシグナルを送信できるようにしたいだけです。これはサービス呼び出しをトリガーするグリッドから項目を繰り返し選択する UI では特に一般的です)。
- 2) 作成時以外の時点でタスクを開始する機能- これが本当に必要かどうかはわかりませんが、タスクを生成してすぐに実行しない方がよいと思いました。結局、それがタスクの要点だと思いました。
- 3) バインド可能なプロパティ- WCF UI をバインドして
IsCompleted
、Task クラスが操作の内部を UI から抽象化できるようにします。 - 4)操作の実行を抽象化する機能-モック、何とか何とか、将来のリファクタリングなど。
ただし、これらの利点はまったく得られないようです。
- 1) Task にはアボート機能がありません。これは本当に奇妙に思えます。
- 2)私が扱うことができる唯一のオーバーロード
Task.Factory.FromAsync<>
は、以下に示すものです。これにより、(Fiddler で見られるように) Web サービス操作の実行がすぐに開始され、後で呼び出しを開始できません。 - 3) タスクが実装されていない
INotifyPropertyChanged
ため、UI にバインドできません。 - 4) 他の 3 つの利点が発生していないことを考えると、これは水中で死んでいるようなものです :-(
すっごく....WCFで生成されたプロキシをタスクで動作させようとして時間を無駄にしているだけですか-それとも何か不足していますか。
// WCF client
var client = new ShoppingCartClient();
// create task
var t = Task.Factory.FromAsync<GetOrderDetailsMsgOut>(
client.BeginGetOrderDetails(new GetOrderDetailsMsgIn()
{
OrderId = 12345
}, null, null),
client.EndGetOrderDetails);
t.ContinueWith(x =>
{
var order = x.Result.Order;
// do something with order
});