サービス参照で CancelTransactionByRefPos という名前のメソッドを呼び出す必要があります。このメソッドには次のシグネチャがあります。
int CancelTransactionByRefPos(long refPos, out string resultDescription);
このメソッドが「0」を返す場合、キャンセルは成功です。このメソッドが別の値を返す場合、メソッドを再度呼び出す必要があります。
CancelTransactionByRefPos を呼び出す Cancel メソッドを作成しました。応答が返されるまでに 30 秒かかる場合があるため、呼び出しが非同期で行われることが非常に重要です。
私の方法は次のようになります。
public void Cancel(long refPos, GiftCard giftCard, Account_3_2 account)
{
var task = Task.Factory.StartNew(() =>
{
int result;
do
{
string resultDescription;
result = _client.CancelTransactionByRefPos(refPos, out resultDescription);
// logic to log the result with the giftcard and account parameter
} while (result != 0);
});
// task.Wait(); // ######## Uncomment this -> code executes! ########
}
コメントの task.Wait() 部分でキャンセルすると、ThreadAbortException が発生します。
task.Wait() のコメントを外して再度実行すると、すべてうまくいきますが、タスクが実行されるまで待たなければならない場合は、メソッドを非同期で呼び出しても意味がありません。
編集
また、サービス参照を構成して、非同期操作を生成できるようにしました。同じ問題。