Project structure

I am looking for input on whether I am doing anything glaringly wrong or odd with the following code.
The final work will cycle through various routines 3 maybe more. So at this stage, I am just looking to make sure it will be stable over time.
It works but - I have some questions:
Is the use of a while control structure to exit the routine ok? Is there a better way?
Will .yeildAndReset cause issues (has not so far)

(
var a_part, b_part, c_part, a_loop, b_loop, c_loop, trig_a, trig_b, trig_c, next;

next = {arg a1 = 0.1,b1 = 0.1,c1 = 0.6;
	x = [a_part,b_part,c_part].wchoose([a1,b1,c1].normalizeSum);

	x
};

a_part = Routine({
	trig_a = 0;

	a_loop = ({ loop{ 1.wait; "loop".postln; trig_a = [1,0].wchoose([0.5,0.5]);  } } ).fork;
	1.wait; "a post before while & after a_loop".postln;

	while ( {trig_a == 0}, { 0.02.wait });

	a_loop.stop;
	1.wait;
	"a done".postln;
	next.value(a1:0.1,c1:0,b1:0.6).play;
	a_part.yieldAndReset;
});

a_part.play;

b_part = Routine({

	trig_b = 0;

	"b here now".postln;
	b_loop = ({ loop{ 1.wait; "loop".postln; trig_b = [1,0].wchoose([0.5,0.5]); } } ).fork;
	1.wait; "a post before while & after b_loop".postln;

	while ( {trig_b == 0}, { 0.02.wait });

	b_loop.stop;
	1.wait;
	"b done".postln;
	next.value(a1:0.1,c1:0.3,b1:0.6).play;
	b_part.yieldAndReset;
});

c_part = Routine({
	/*etc etc*/
	"c here now".postln;
	1.wait;
	c_part.yieldAndReset;
});

)

Thanks in advance
d