题
是否有任何办法阻止内部的另一方法的运行循环或在C#动态插入break语句?
由于
编辑:我希望能够动态地拦截方法和插入休息的时候一个事件在另一个function.I被触发有类的几个实例,以停止循环,我想停止循环中的每个实例时要求和管理所有的实例。考虑多个实例是在一个通用的列表
示例:
List<myclass> objlist=new List<myclass>();
foreach(myclass obj in objlist)
{
obj.loopingfunction().BreakLoop //or something like this (assuming that the loopingfunction is already called)
}
我需要这个,因为我想打破一旦用户存储一些巨大的数据。当数量的用户导入数据的循环中,我得到发射了事件。但我不能保持,因为它搞砸了SQLSERVER检查从多个实例数据库。
这是在ASP.Net应用程序。
解决方案
如果整个事情是在一个线程中运行,这将没有任何意义。如果循环运行,则没有其他在同一时间运行。如果你正在运行在另一个线程一个循环,并在另一个线程的控制方法,您可以完全中止循环线程或检查循环中一个标志来决定你是否应该打破,并在控制方法设置适当的标志
更新:使该函数返回一个布尔值,指示是否应该打破,并在“if
”语句中使用它:
if (myFunctionShouldBreakLoop()) break;
其他提示
另一种选择是在循环的每一次迭代过程中,以提高一个CancelEventArgs。可能不是最有效的,但另一种选择仍然:
private void SomeMethod()
{
for (int i = 0; i <= 100000; i++)
{
Console.WriteLine(i);
if (LoopIncrement != null)
{
CancelEventArgs args = new CancelEventArgs();
LoopIncrement(null, args);
if (args.Cancel)
{
break;
}
}
}
和然后别处:
myObj.LoopIncrement += MyHandler;
private void MyHandler(object sender, CancelEventArgs e)
{
if(someCondition)
{
e.Cancel = true;
}
}
此方式可以有所控制从外部环路....
有在锁定属性的条件。
private Boolean BreakCondition
{
get { lock(_LockObject) { return _BreakCondition; } }
set { lock(_LockObject) { _BreakCondition = value; } }
}
private Boolean _BreakCondition = false;
private Object _LockObject = new Object();
if (this.BreakCondition)
{
break;
}
如何使用迭代器和产量魔来解决这个问题。
下面是对无限列表的物品可能是有用
的http:// WWW .codethinked.com /后/ 2009/02/04 /无穷解释-随着-C-Yield.aspx
class Program
{
static void Main(string[] args)
{
Predicate<int> when = i => i > 100 && Console.ReadKey().KeyChar.ToString() == "0";
foreach(var i in Numbers().BreakOn(when))
{
Console.WriteLine(i);
}
Console.ReadLine();
}
private static IEnumerable<int> Numbers()
{
var i = 0;
while(true)
{
yield return i++;
}
}
}
public static class Util
{
public static IEnumerable<int> BreakOn(this IEnumerable<int> sequence, Predicate<int> when)
{
foreach(int i in sequence)
{
if(when(i))
{
yield break;
}
yield return i;
}
}
}
我想你可以使用标志
bool stop = false;
for(int i=0;i<num;i++)
{
if(stop) break;
}
简短的回答是:没有。如果不控制代码,那么你可以不会导致循环终止。
如果你控制的代码,你可以建立某种合作的,但它听起来混乱。也许你可以在阐述为什么?
不隶属于 StackOverflow