- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一段代码可以搜索多个第三方 API。我根据搜索条件将搜索分成两组。我开始这两个搜索,因为每个搜索都非常及时,但如果第一组搜索结果匹配,我不想等待第二个搜索组完成。所以基本上我所拥有的是:
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 完成。如果我不再需要它的结果,有什么方法可以简单地结束或取消该委托(delegate)?
最佳答案
我能够使用 System.ComponentModel.BackgroundWorker 解决我的问题。我不一定按照预期的方式使用它,但它能够满足我的需要。所以基本上我的新代码是这样的:
Dictionary<string, string> telResult = null,
nameResult = null;
BackgroundWorker bw = new BackgroundWorker();
bw.WorkerSupportsCancellation = true;
bw.DoWork += (obj, e) => nameResult = SearchByName(name, bw);
bw.RunWorkerAsync();
if(!string.IsNullOrWhiteSpace(telNum))
telResult = SearchByTelNum(telNum);//Will return null if a match is not found
if(telResult != null)
{
bw.CancelAsync;
return telResult;
}
bool hasTimedOut = false;
int i = timeOutCount;
while (bw.IsBusy && !hasTimedOut)
{
System.Threading.Thread.Sleep(500);
if (0 == --i) hasTimedOut = true;
}
return nameResult;
为了确保没有错误,我必须确保 SearchByName 定期检查 bw.CancellationPending 是否等于 true,并在这种情况下结束该方法。 CancelAsync 不会结束工作线程,它只是提醒工作线程调用者线程已取消它。
我也可以简单地使用
while(bw.IsBusy) System.Threading.Thread.Sleep(500)
等待方法完成,但如果 SearchByName 中发生错误,您可能会在无限循环中永远等待。这样我就可以在方法被认为超时之前设置一个时间量,并且调用者线程继续运行。在这种情况下,由于我每 0.5 秒检查一次 bw.IsBusy,超时长度等于 timeOutCount/2 秒。
好的,我想我已经彻底回答了我自己的问题。
关于c# - 如果我不再关心结果,是否还有结束委托(delegate)的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14596556/
我一直在学习如何创建自定义 ArrayAdapter 并熟悉重写 ArrayAdapter 的 getViewTypeCount 和 getItemViewType 方法。 为什么 Android V
我是一名优秀的程序员,十分优秀!