c# 윈폼 UI

μœˆνΌμ—μ„œ μ—˜λ¦¬λ² μ΄ν„°κ°€

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λ₯Ό μ‚¬μš©ν•΄ ν‘œν˜„ν•˜λŠ”β€¦

근데 읽고 λ³΄λ‹ˆ μœˆνΌμ΄κ΅°μš”.

μœˆνΌλ„ μš”μ¦˜ 바인딩 λ˜λŠ”κ±Έλ‘œ λ“€μ—ˆλŠ”λ°

2개의 μ’‹μ•„μš”

UI μŠ€λ ˆλ“œμ—μ„œ 일정 μ‹œκ°„ κ°„κ²©μœΌλ‘œ ν˜„μž¬ μ—˜λ ˆλ² μ΄ν„° μ›€μ§μž„ μƒνƒœλ₯Ό μ²΄ν¬ν•΄μ„œ μ—°λ™ν•˜λŠ”κ²Œ νŽΈν• λ“― ν•˜λ„€μš”. Moveμ—μ„œλŠ” μΈ΅λ§ˆλ‹€ κ·Έ λ³€μˆ˜λ₯Ό λ°”κΏ”μ£Όκ³ μš”.

Async in 4.5: Enabling Progress and Cancellation in Async APIs - .NET Blog

1개의 μ’‹μ•„μš”

보톡 μ—˜λ ˆλ² μ΄ν„° μΉ΄(?) λŒ€κ²Œ 상뢀 λ˜λŠ” ν•˜λ‹¨ μͺ½μ— μΈ΅ ν‘œμ‹œ μ„Όμ„œκ°€ μžˆμ–΄μ„œ
각 μΈ΅λ§ˆλ‹€ μ„Όμ„œ μΈμ‹μœΌλ‘œ 인해 μΈ΅ ν‘œμ‹œλ₯Ό ν•©λ‹ˆλ‹€.

μ„Όμ„œ μœ„μΉ˜λŠ” μ—˜λ ˆλ² μ΄ν„° μ œμž‘μ‚¬ μžμœ μž…λ‹ˆλ‹€.

λ‹¨νŽΈμ μΈ 예둜 이해λ₯Ό 도움을 λ“œλ¦¬μžλ©΄ 체감상 ν˜„μž¬ 측에 μœ„, μ•„λž˜μ— μžˆμ§€λ§Œ 측이 λ³€ν•˜μ§€ μ•Šκ³  거의 λ„μ°©ν–ˆμ„ λ•Œ λ˜λŠ” ν•΄λ‹Ή 측에 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개의 μ’‹μ•„μš”