У меня есть веб-служба WCF, которая в настоящее время ищет несколько жестко закодированных индексов dtSearch, а затем объединяет полученные наборы данных для возврата клиенту. У меня есть следующий код 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
}
}
Мой вопрос: каков наилучший способ переместить эту логику в отдельный общий класс и сделать это для объектов List из 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.
}
}