관리 코드에서 여러 스레드 관리

비동기 메서드를 호출하거나 Visual Studio UI 스레드 이외의 스레드에서 실행되는 작업이 있는 관리형 VSPackage 확장이 있는 경우 아래에 제공된 지침을 따라야 합니다. 다른 스레드에서 작업이 완료되기를 기다릴 필요가 없으므로 UI 스레드의 응답성을 유지할 수 있습니다. 스택 공간을 차지하는 추가 스레드가 없으므로 코드를 보다 효율적으로 만들 수 있으며 교착 상태 및 응답하지 않는 코드를 방지하므로 보다 안정적이고 쉽게 디버그할 수 있습니다.

일반적으로 UI 스레드에서 다른 스레드로 전환하거나 그 반대로 전환할 수 있습니다. 메서드가 반환되면 현재 스레드는 원래 호출된 스레드입니다.

Important

다음 지침에서는 Microsoft.VisualStudio.Threading 네임스페이스, 특히 JoinableTaskFactory 클래스의 API를 사용합니다. 이 네임스페이스의 API는 Visual Studio 2013의 새로운 기능입니다. ThreadHelper 속성 ThreadHelper.JoinableTaskFactory에서 JoinableTaskFactory 인스턴스를 가져올 수 있습니다.

UI 스레드에서 백그라운드 스레드로 전환

  1. UI 스레드에 있고 백그라운드 스레드에서 비동기 작업을 수행하려는 경우 Task.Run()을 사용합니다.

    await Task.Run(async delegate{
        // Now you're on a separate thread.
    });
    // Now you're back on the UI thread.
    
    
  2. UI 스레드에 있고 백그라운드 스레드에서 작업을 수행하는 동안 동기적으로 차단하려는 경우 다음 Run 내의 TaskScheduler 속성 TaskScheduler.Default를 사용합니다.

    // using Microsoft.VisualStudio.Threading;
    ThreadHelper.JoinableTaskFactory.Run(async delegate {
        await TaskScheduler.Default;
        // You're now on a separate thread.
        DoSomethingSynchronous();
        await OrSomethingAsynchronous();
    });
    

백그라운드 스레드에서 UI 스레드로 전환

  1. 백그라운드 스레드에 있고 UI 스레드에서 작업을 수행하려는 경우 SwitchToMainThreadAsync를 사용합니다.

    // Switch to main thread
    await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
    

    SwitchToMainThreadAsync 메서드를 사용하여 UI 스레드로 전환할 수 있습니다. 이 메서드는 현재 비동기 메서드의 연속으로 UI 스레드에 메시지를 게시하고 나머지 스레딩 프레임워크와 통신하여 올바른 우선 순위를 설정하고 교착 상태를 방지합니다.

    백그라운드 스레드 메서드가 비동기식이 아니고 비동기식으로 만들 수 없는 경우에도 이 예제와 같이 Run으로 작업을 래핑하여 await 구문을 사용하여 UI 스레드로 전환할 수 있습니다.

    ThreadHelper.JoinableTaskFactory.Run(async delegate {
        // Switch to main thread
        await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();
        // Do your work on the main thread here.
    });