yjs
1
μνΌμμ μλ¦¬λ² μ΄ν°κ°
Move(); // μλ λ² μ΄ν° μμ§μ ν¨μ
UIMove() // μ€μ μνΌ UI μμ§μ ν¨μ
Moveκ° λλλ©΄ UIMove λ‘ uiκ° μμ§μ
λλ€ μ΄λ°μμΌλ‘ λμν΄λ λλμ?
μλλ©΄ λκ°κ° λμμ μλν΄μΌνλμ?
μ λ κ²νλ©΄ μ½λμμλ μΈ΅μμ λμ°©ν΄λ uiλ μμ§μ΄κ³ μλλ° μ΄λ»κ² μ²λ¦¬ν΄μΌν κ°μ?
μλ¦¬λ² μ΄ν°μ μ€μ μμ§μκ³Ό UI μ νμλ₯Ό μΌμΉμν€λ €λ©΄
UIMove() κ° μλλΌ λκ° μ€μ μλ¦¬λ² μ΄ν°μ car μμΉλ₯Ό μΌμλ‘ λ°μμ μ²λ¦¬ν΄μΌνμ§ μμκΉμ?
κ° μ μΈ κ²½νμΌλ£¨β¦
μλ² μμ κ°ν μ μ΄ μμλλ°μβ¦
14μΈ΅μμ μΆλ°ν΄μ 1μΈ΅μΌλ‘ λ΄λ €κ°λ μλ¦¬λ² μ΄ν°μλλ°
λκ° κ±Έλ¦¬λ λ―ν μμ§μμ 보μ΄λ€ κ²°κ΅ λ©μΆ° μ°μ§λ§
car λ΄λΆμ νμ¬ μΈ΅ νμλ κ³μ μμ§μ¬μ 1μΈ΅μΌλ‘ νμλλλΌκ΅¬μ.
κ°μ΄ κ°ν μ¬λλ€ λͺ¨λ 1μΈ΅μμ λ©μ·λ€κ³ μκ°ν΄ μμ¬νμ§λ§
νμ§λ§ μ€μ λ‘ 7μΈ΅μ κ±Έλ €μ λ§€λ¬λ € μμμ΄μβ¦
λκ΅°κ° κ°ν μ¬λ μ§μΈμ΄ μ νν΄μ
μΌ λ 7μΈ΅μμ λ©μΆ°μ λ§€λ¬λ € μμ΄!
λΌκ³ μλ €μ€ λ€μμμΌ λ€λ€ 곡ν©μ΄ μ°Ύμμμμ£ β¦
1μΈ΅ λμ€νλ μ΄μμλ μ μμ μΌλ‘ νμλμλ 보λλΌκ΅¬μ.
30λΆ κ°κΉμ΄ λ§€λ¬λ € μμμ΄λ€. κ±°μ 20m 곡μ€μμβ¦=γ
=;
(κ·Έ λ€λ‘ ν λμ μλ¦¬λ² μ΄ν°λ₯Ό λͺ» νβ¦)
μ€μ μλ¦¬λ² μ΄ν°μ μμΉμ UI νμλ₯Ό μΌμΉνλ €λ©΄ μ€μ κ°μ λ°μμ μ²λ¦¬ν΄μΌν κ±° κ°λ€μ.
κ·Έκ² μλλΌλ©΄ UI νμλ λ³ μλ―Έ μμ λ― ν©λλ€.
2κ°μ μ’μμ
vmμ floor κ°μ΄ μλ€κ³ νλ©΄
xamlμμ converterλ₯Ό μ¬μ©ν΄ νννλβ¦
κ·Όλ° μ½κ³ 보λ μνΌμ΄κ΅°μ.
μνΌλ μμ¦ λ°μΈλ© λλκ±Έλ‘ λ€μλλ°
RanE
5
UI μ€λ λμμ μΌμ μκ° κ°κ²©μΌλ‘ νμ¬ μλ λ² μ΄ν° μμ§μ μνλ₯Ό 체ν¬ν΄μ μ°λνλκ² νΈν λ― νλ€μ. Moveμμλ μΈ΅λ§λ€ κ·Έ λ³μλ₯Ό λ°κΏμ£Όκ³ μ.
λ³΄ν΅ μλ λ² μ΄ν° μΉ΄(?) λκ² μλΆ λλ νλ¨ μͺ½μ μΈ΅ νμ μΌμκ° μμ΄μ
κ° μΈ΅λ§λ€ μΌμ μΈμμΌλ‘ μΈν΄ μΈ΅ νμλ₯Ό ν©λλ€.
μΌμ μμΉλ μλ λ² μ΄ν° μ μμ¬ μμ μ
λλ€.
λ¨νΈμ μΈ μλ‘ μ΄ν΄λ₯Ό λμμ λ리μλ©΄ 체κ°μ νμ¬ μΈ΅μ μ, μλμ μμ§λ§ μΈ΅μ΄ λ³νμ§ μκ³ κ±°μ λμ°©νμ λ λλ ν΄λΉ μΈ΅μ 2/3μ λ μΈ΅μ΄ λ³νκ° μκΉλλ€.(μ΄κ²λν μ μμ¬ λ§μβ¦)
μ€μ μλ λ² μ΄ν° νλ‘ν μ½λ₯Ό 보μλ©΄ κΈ°λ³Έμ μΈ λ² μ΄μ€λ‘
λ€μ λ΄μ©μ ν¬ν¨λμ΄μμ΅λλ€.
μν : μμ§μ, μ μ§
λ°©ν₯ : μ, μλ
νμ¬ μΈ΅ μ :
μ΄μ μν : λΉμ μ΄μ , νμ¬μ΄μ , μ μ μ΄μ
1κ°μ μ’μμ
μ΄ μνλ₯Ό κΈ°μ€μΌλ‘ μ½λλ₯Ό μ§ λ€λ©΄,
class MoveExam
{
public async Task InitiateMove(int to, Action<ElevatorStatus> moveUi)
{
var progress = new Progress<ElevatorStatus>(moveUi);
try {
await Move(to, progress);
} catch (MoveEndException) {
Console.WriteLine("Move ends. See you again.");
} catch (Exception) { throw; }
}
async static Task Move(int to, IProgress<ElevatorStatus> progress)
{
var current = new ElevatorStatus(1, Moving.None, Mode.Normal);
var target = new ElevatorStatus(to, Moving.None, Mode.Normal);
DateTime start = DateTime.Now;
progress.Report(current);
while(current.Mode == Mode.Normal && current != target)
{
await Task.Delay(100);
var now = DateTime.Now;
// Too frequent reporting will clock subscriber.
if((now - start) >= TimeSpan.FromSeconds(1))
{
start = now;
// immitate calling status checkers.
var floor = current.Floor + 1;
var moving = floor == to ? Moving.None
: floor < current.Floor ? Moving.Down
: Moving.Up;
var mode = Mode.Normal;
current = new ElevatorStatus(floor, moving, mode);
progress.Report(current);
}
}
// Handle abnormal modes
// if(current.Mode != Mode.Normal) { }
throw new MoveEndException();
}
}
record ElevatorStatus(int Floor, Moving Moving, Mode Mode);
enum Moving { None=0, Up, Down }
enum Mode { Normal = 0, Emergency, Fire }
class MoveEndException : Exception {}
μ€ν
await new MoveExam().InitiateMove(5, status => Console.WriteLine(status));
Console.ReadKey();
κ²°κ³Ό
ElevatorStatus { Floor = 1, Moving = None, Mode = Normal }
ElevatorStatus { Floor = 2, Moving = Up, Mode = Normal }
ElevatorStatus { Floor = 3, Moving = Up, Mode = Normal }
ElevatorStatus { Floor = 4, Moving = Up, Mode = Normal }
ElevatorStatus { Floor = 5, Moving = None, Mode = Normal }
Move ends. See you again.
2κ°μ μ’μμ