2011-01-27 4 views
3

새로운 비동기식 CTP를 공부하고ThreadPool.SwitchTo 메서드는 어디에서 찾을 수 있습니까?

코드 조각을 발견했습니다.

public async void button1_Click(object sender, EventArgs e) 
{ 
string text = txtInput.Text; 

await ThreadPool.SwitchTo(); // jump to the ThreadPool 

string result = ComputeOutput(text); 
string finalResult = ProcessOutput(result); 

await txtOutput.Dispatcher.SwitchTo(); // jump to the TextBox’s thread 

txtOutput.Text = finalResult; 
} 

어디에서 ThreadPool.SwitchTo를 찾을 수 있습니까? SwithcTo 메서드가 ThreadPool 클래스에 없습니다.

AsyncCtpLibrary.dll에 대한 평가가 있습니다.하지만 운이 없다

+0

내게 확장 방법처럼 보입니다. –

+0

Visual Studio에 코드가로드되어 있다고 가정하면 메서드의 이름을 마우스 오른쪽 단추로 클릭하고 "정의로 이동"을 선택하십시오. 해당 방법을 정의한 곳으로 즉시 이동하여 학습 할 수 있습니다. 나는 이것이'ThreadPool' 클래스가 아닌 다른 곳에서 정의 된 확장 메소드라는 chibacity의 가정을 의심한다. –

+0

그래도 어디에서? AsyncCtpLibrary.dll에 대한 참조를 추가했지만 행운은 없습니다 –

답변

2

이 CharlesO 위의 코멘트를 내 자신의 질문에 대답하지 :

OK, 그것들을 찾았습니다. 요약 : ThreadPool과 상호 작용하는 방법은 입니다. 설명 : ThreadPoolEx는 자리 표시 자입니다. System.Threading.ThreadPoolEx 요약의 System.Runtime.CompilerServices.YieldAwaitable 회원으로

공공 공유 기능 SwitchTo() : 가 기다려온 때 비동기 ThreadPool이에 얻을 수 있다는 awaitable 작성합니다.

1

ThreadPool.SwitchTo은 아마도 anit-pattern이기 때문에 제거되었을 것입니다. 원래 컨텍스트로 다시 전환하기 전에 예외가 throw 된 경우 발생할 일을 고려하십시오. finally 블록을 await 블록에 표시 할 수 없으므로 finally 블록을 카운터 조치로 사용하여 해당 예외를 방지하고 다시 전환 할 수 없습니다.

public async void button1_Click(object sender, EventArgs e) 
{ 
    await ThreadPool.SwitchTo(); 
    try 
    { 
    // Do something dangerous here. 
    } 
    finally 
    { 
    await button1.Dispatcher.SwitchTo(); // COMPILE ERROR! 
    } 

} 

사용자 지정 대기 및 대기 유형을 개발하여 제거 된 내용을 정확하게 얻을 수 있습니다. 그러나 await을 통해 컨텍스트 중간을 전환하는 것보다 Task.Run 을 사용하는 것이 훨씬 더 좋습니다.

관련 문제