我有一个 WCF Web 服务,它当前搜索多个硬编码的 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
}
}
我的问题是:将此逻辑移动到一个单独的通用类并为 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.
}
}