멀티 스레드 환경을 처리하려고 시도한 Form
이 있다고 가정 해 보겠습니다. 그것은 어떤 UI 수정이 완료되기 전에 UI 스레드에서 실행중인 경우에 따라서 검사 :비동기 메서드 내에서 InvokeRequired UI 패턴을 구현하려면 어떻게해야합니까?
partial class SomeForm : Form
{
public void DoSomethingToUserInterface()
{
if (InvokeRequired)
{
BeginInvoke(delegate { DoSomethingToUserInterface() });
}
else
{
… // do the actual work (e.g. manipulate the form or its elements)
}
}
}
이제
의 내가 그 방법의 …
일부 내부의 긴 작업을 수행하고 가정 해 봅시다; 따라서 async/await
을 사용하여 비동기로 만들고 싶습니다.
void
대신 Task
(예외가 catch 될 수 있음)을 반환하도록 메서드 서명을 변경해야한다고 가정하면 BeginInvoke
을 수행하는 부분을 어떻게 구현할 수 있습니까? 무엇을 반환해야합니까?
public async Task DoSomethingToUserInterfaceAsync()
{
if (InvokeRequired)
{
// what do I put here?
}
{
… // like before (but can now use `await` expressions)
}
}
Btw., 나는 긴 연산을 추출하고, 일단 완료되면, 그 결과를'doSomethingToUserInterface'에 인수로 전달합니다. DoSomethingToUserInterface는 더 이상 'async'가 될 필요가 없습니다 (따라서 여기서 제시된 문제를 피할 수 있습니다). 그래도 여전히 솔루션에 관심이 있습니다. – stakx
일반적으로,'async' /'await'는'Invoke()'에 대한 필요성을 제거해야합니다. 나는. GUI가 아닌 스레드 컨텍스트에서 이러한 메서드를 호출하는 상황에서 이전에는 어디에서나 이러한 코드를 사용하지 않도록 코드를 구성 할 수 있어야합니다. 따라서 여기서 메소드 서명을 변경하는 방법을 묻기보다는 호출자를 변경하여 처음부터 호출 할 필요가 없도록해야합니다. –
@PeterDuniho : 합리적인 제안 인 것으로 보입니다. 그래서 기본적으로'DoSomethingToUserInterfaceAsync' (Windows Forms UI 이벤트 핸들러 일 가능성이있는 메소드까지) 호출 체인을 추적해야하며, 이러한 호출자 메소드가 모두'async/await'를 사용하도록 만드시겠습니까? – stakx