function hangs from time to time

Hi.
i'm batteling with the following function, which all of a sudden makes the program hang;

boolean WaitFor(int Hva,unsigned long Wait){
unsigned long Time=millis();
boolean Funnet=false;
String msg="";
String VentPa;
switch(Hva){
case 1:
VentPa="OK"; break;
case 2:
VentPa="+SIND: 4";break;
case 3:
VentPa="+SIND: 11";break;
case 4:
VentPa="+CMGS:";break;
}

while (millis()-Time<Wait){
ReadAlarmInputs();
if (cell.available()>0){
Time++;
char in=cell.read();
Serial.print(in);
if((int(in)==10) or (int(in)==13)){
if((int(in)==13) and (Funnet==true)){return true;}
if(int(in)==13){msg="";}
}
else{
msg+=in;
if(msg==VentPa){Serial.print("Jeg Fant: ");Serial.println(VentPa); Funnet=true;}
}
}
}
return false;
}

void ReadAlarmInputs(){
static boolean OnOff;
if (OnOff==true){
digitalWrite(9,LOW);OnOff=false;}
else{
digitalWrite(9,HIGH);OnOff=true;}

//Først de digitale innganger. Pumper Sendes etter WalkOut..
if(digitalRead(Pumper)==IsAlarm[1]){
delay(2);
if(digitalRead(Pumper)==IsAlarm[1]){
BPFlag=true;}
}
//Innbrudd Alarmer FØR Walkout forkastes, og alarm sendes bare etter Walkout
if(digitalRead(Innbrudd)==IsAlarm[2]){ //Alarm fra Pumper
delay(2);
if(digitalRead(Innbrudd)==IsAlarm[2]){
if (WOFlag==false){BAFlag=true;} //Set Intruder Flag
//Her bør det kanskje settes opp en lysdiode elelr lignnende som tegn på at aktivitet er detektert.
}
}
}

Help would be very much appreciated!

Just reading the code .. nothing is jumping out at me. Hard to say without see it in context.

If your using that in interrupt it may take too long and hang.

If you pass a value that is computed way in advance it may hang while it waits for longer than you expected.

  if(digitalRead(Pumper)==IsAlarm[1]){
    delay(2);
    if(digitalRead(Pumper)==IsAlarm[1]){
       BPFlag=true;}
  }
 //Innbrudd  Alarmer FØR Walkout forkastes, og alarm sendes bare etter Walkout
 if(digitalRead(Innbrudd)==IsAlarm[2]){  //Alarm fra Pumper
   delay(2);
   if(digitalRead(Innbrudd)==IsAlarm[2]){

How is IsAlarm defined? Are you referencing IsAlarm[0] somewhere else, or are you using the wrong values as indexes into the array? C uses 0 as the first index, not 1.