【发布时间】:2013-01-30 04:10:54
【问题描述】:
我有一段代码可以搜索多个第三方 API。我根据搜索条件将搜索分为 2 组。我开始两个搜索,因为每个搜索都非常及时,但如果第一组搜索结果匹配,我不想等待第二个搜索组完成。所以基本上我所拥有的是:
Dictionary<string, string> result = null;
NameSearchDelegate nameDel = new NameSearchDelegate(SearchByName);
IAsyncResult nameTag = nameDel.BeginInvoke(name, null, null);
if(!string.IsNullOrWhiteSpace(telNum))
{
result = SearchByTelNum(telNum);//Will return null if a match is not found
}
if(null == result)
{
result = nameDel.EndInvoke(nameTag);
}
//End the delegate to prevent memory leak
//else
//{
// nameDel.EndInvoke(nameTag)
//}
return result;
所以我想在调用 SearchByTelNum 之前启动 SearchByName,以防它找不到匹配项,但是如果找到匹配项,我不想在返回匹配项之前等待 SearchByName 完成。如果我不再需要它的结果,有什么方法可以简单地结束或取消该委托?
【问题讨论】:
-
像经理一样思考 - 不要告诉代表它的工作不再有用,让它继续并忽略它的结果。
-
是的,我同意 D Stanley 的观点。您可以调用两个搜索并只使用第一个返回的结果。在此条件下,杀死代理可能对节省资源没有帮助。
-
但是通过不在委托上调用 EndInvoke 是否允许可能的内存泄漏? link 供参考,它是 .NET 4.0
-
我认为我在此处找到的 John Koerner 引用的线程中找到了我正在寻找的答案stackoverflow.com/a/1410344/1757384。通过使用 BackgroundWorker,(System.ComponentModel.BackgroundWorker) 我可以调用 CancelAsync 方法来“取消”线程。我现在正在尝试,会告诉你进展如何。
标签: c# multithreading delegates