Trouble with Moving an Enemy back and forth

So I made a enemy walk back and forth using IEnumerator

public float speed;
	Rigidbody2D rbody;
	public float timer;

	public float directionx;
	public float directiony;

	public bool canMove = true;
	// Use this for initialization
	void Start () {
		rbody = GetComponent<Rigidbody2D> ();
		StartCoroutine (Move(timer));

	}


	IEnumerator Move(float timer){

		if (!canMove) {

			rbody.velocity = Vector2.zero;
			yield break;
		}

		while (canMove == true) {
				Vector2 targetVelocity = new Vector2 (directionx, directiony);
				rbody.velocity = targetVelocity * speed;
				yield return new WaitForSeconds (timer);
				Vector2 targetVelocity1 = new Vector2 (-directionx, -directiony);
				rbody.velocity = targetVelocity1 * speed;
				yield return new WaitForSeconds (timer);
		}

	}

}

However, my problem is I want the enemy to stop immediately when killed hence the canMove bool. With my current code, when I fire off the canMove bool, the enemy won’t stop and is stuck forever moving one way. I can kinda see why this is happening but I’m not sure how to fix it. Maybe IEnumerators isn’t the right way to go?
Any help is greatly appreciated.

Indeed, using a coroutine here may not be the best option, unless you add a while( true ) around the body of the function. I suggest you the FixedUpdate instead.

Following code not tested:

 public float speed;
 Rigidbody2D rbody;
 float time;

 public float timer;

 public float directionx;
 public float directiony;

 public bool canMove = true;
 // Use this for initialization
 void Start () {
     rbody = GetComponent<Rigidbody2D> ();
 }


 private FixedUpdate()
 {
     if (!canMove)
     {
         rbody.velocity = Vector2.zero;
         return;
     }
     
     Vector2 targetVelocity = Mathf.Repeat( time, timer * 2 ) < timer ?
         new Vector2 (directionx, directiony) :
         new Vector2 (-directionx, -directiony);
     rbody.velocity = targetVelocity * speed;
     time += Time.fixedDeltaTime;
 }