>

WPF 앱의 UI 스레드에서 호출되는 생성자가 있습니다. 내부에서 비동기 메소드를 호출하지만 동기 방식으로 수행해야합니다. 그래서 나는 기다림을 시도했지만 교착 상태가 발생하여 이유를 이해합니다. 그래서 메소드를 비동기식 또는 동기식으로 실행해야하는지 여부를 나타내는 인수를 소개했습니다. 다음과 같은 것 :

// constructor that is called on UI thread
public MyClass()
{
    Method1(false).Wait();
}
public async Task Method1(bool runAsync)
{
    await Method2(runAsync);
}
public async Task Method2(bool runAsync)
{
    if (runAsync)
    {
        await Task.Run(() => Thread.Sleep(1000));
    }
    else
    {
        Thread.Sleep(1000);
    }
}

UI 스레드에서 모든 것이 실행되기를 원하기 때문에 ConfigureAwait를 사용하고 싶지 않습니다. Will Method1 (false) .Wait ();교착 상태가 발생 했습니까 (사용하는 것이 안전합니까)? 나는 그것을 많이 테스트했지만 확실하지는 않지만 확실하지 않습니다. 마지막으로, 내 진짜 질문은 : 'await Task.Run (...'이 실행되지 않으면, 메소드가 완전히 동기화되어 있습니까?

  • 답변 # 1

    와이즈 비즈

    저기서 멈출께요. 가장 좋은 해결책은 UI 스레드에서 동기/차단 코드를 실행하는않습니다입니다. 사용자 환경이 저하됩니다. 대신, 이러한 상황에 처하지 않도록 코드를 재구성해야합니다.

    UI가 표시 될 때 UI 프레임 워크는 코드에 데이터를 표시하도록 요청합니다. 코드는동 기적으로 실행되고 즉시 반환해야합니다 (차단하지 않음). 그러나 데이터를 표시하려면 코드에서 비동기 작업을 수행해야합니다. 그래서 거기에 갈등이 있습니다.

    솔루션은 UI의 중간 상태 (예 : "로드 중 ..."메시지 또는 스피너)를 디자인하는 것입니다. 그런 다음 코드가 시작되면 "로드 중"상태 (및시작비동기 작업)를 동기식/즉시 표시하고 비동기식 데이터가 도착하면업데이트UI를 '최종'상태로 설정합니다.

    비동기 MVVM 데이터에 대한 기사에서이 패턴에 대해 자세히 설명합니다.

  • 답변 # 2

    비 동기화 작업에서 블로킹 솔루션이 좋지 않은 경우 (차단 솔루션이 그렇게 좋지 않음) 이 물건들을 뿜어 낼 공장?

    I have a constructor that is called on UI thread in my WPF app. Inside of it, it calls async method but it must be done in a synchronous way.

    그런 다음

    class MyClass
    {
        public MyClass()
        {
        }
        public async Task Method2(bool runAsync)
        {
            //async immediately
            await Task.Delay(1000); //no Thread.Sleep. Blocking code != good
        }
    }
    
    
    public MyClassFactory { public async Task<MyClass> GetAsync() { var c = new MyClass(); await c.Method2(); return c; } }

관련 자료

  • 이전 c# - CookieContainer를 설정할 때 HTTPWebRequest가 실패 함
  • 다음 r - 백 슬래시로 문자열/경로를 자동으로 처리하는 방법은 무엇입니까?