現在、複数のハードコーディングされた dtSearch インデックスを検索し、結果のデータセットをマージしてクライアントに返す WCF Web サービスがあります。次の C# コードがあります。
public class Search : ISearch
{
delegate DataTable PDelegate(string term, int cid);
delegate DataTable CDelegate(string term, int sid);
public DataTable SearchPIndex(string term, int cid) {/* do search */}
public DataTable SearchCIndex(string term, int sid) {/* do search */}
public DataTable SearchAll(string term, int cid, int sid)
{
PDelegate pDel = new PDelegate(SearchPIndex);
CDelegate cDel = new CDelegate(SearchCIndex);
IAsyncResult pInvoke = pDel.BeginInvoke(term, cid, null, null);
IAsyncResult cInvoke = cDel.BeginInvoke(temr, sid, null, null);
DataTable pResults = pdel.EndInvoke(pInvoke);
DataTable cResults = cdel.EndInvoke(cInvoke);
// combine the DataTables and return them
}
}
私の質問は次のとおりです。このロジックを別のジェネリック クラスに移動し、これを 1...n オブジェクトのリストに対して行う最善の方法は何ですか?
私が作成したジェネリック オブジェクトは、すべての物理検索 (SearchPIndex メソッドと SearchCIndex メソッドを置き換えます) を実行しますが、デリゲート/IAsyncResult 呼び出しをジェネリックに統合する方法がわかりません。
これについて私が従うことができるベストプラクティスはありますか?
編集:申し訳ありません...サイトの「ユーザー」として初めて...「回答」は、上記の「コメント」よりも適切な場所のようです。
私はそれで遊ぶつもりですが、これはメソッド内で機能しますか?
SearchAsync sa = new SearchAsync(SearchIndex);
var asyncs = new List<IAsyncResult>();
foreach(int index in indices)
{
asyncs.Add(sa.BeginInvoke(term, index, null, null));
}
var tables = new List<DataTable>();
foreach(IAsyncResult iar in asyncs)
{
try
{
tables.Add(sa.EndInvoke(iar));
}
catch
{
//etc.
}
}