データを扱う処理というのは「データ取得」 → 「取得データを処理」という流れで進むけど
「取得データの処理」はいろいろあっても「データ取得」の部分は皆共通だったりする
その部分を括りだしてるのが DataService.GetData

「データ取得」のあとは当然「取得データの処理」が続くけど
GetDataを呼び出す場所でいちいち try-catch して例外処理を書いたりするのはとても面倒
「データ取得」に必ず付随する処理
 ・取得したデータ(item)をどう処理するか
 ・例外(error)発生時にどうするか
をあらかじめ callback として GetData に渡して、GetData にデータ取得後に続けて処理してもらう方がだんぜん楽

余談だけど、非同期処理にコールバックを渡すのはよくあるが、コールバックを書いたからといって必ず非同期になるわけじゃないから、勘違いしないでね…
(提示されたコードは非同期処理となるようには書かれていない)