문제

다른 메소드 내부의 실행 루프를 중지하거나 C#에 동적으로 중단 문을 삽입하는 방법이 있습니까?

감사

편집 : 이벤트가 다른 기능에서 트리거 될 때 메소드를 동적으로 차단하고 휴식을 삽입 할 수 있기를 원합니다. 클래스의 여러 인스턴스가 있으며 필요할 때마다 각 인스턴스에서 루프를 중지하고 싶습니다. 모든 인스턴스. 여러 인스턴스가 일반 목록에있는 것을 고려하십시오

예시 :

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;

다른 팁

또 다른 옵션은 루프를 반복 할 때마다 CancelEventArg를 높이는 것입니다. 그럼에도 불구하고 가장 효율적이지는 않지만 또 다른 옵션 :

    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;
}

반복자를 사용하는 것은 어떻습니까? 문제를 해결하기 위해 마법을 산출하십시오.

다음은 유용 할 수있는 Infinite 목록에 대한 기사입니다.

http://www.codethinked.com/post/2009/02/04/infinite-lists-with-c-mield.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;
}

짧은 대답은 다음과 같습니다. 코드를 제어하지 않으면 루프가 종료 될 수 없습니다.

코드를 제어하면 일종의 협력을 구축 할 수 있지만 지저분한 것 같습니다. 어쩌면 왜 그런지 자세히 설명 할 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top