2017-11-05 4 views
-1

을 형성?는 C# 4.5 작업 창에서 병렬 나는 모든 방법이 비동기 있습니다 타사 라이브러리를 가지고 있고 나는 몇 가지 질문 <p>1</p>)이 두 개의 코드 라인의 차이점은 무엇입니까이

Task.Run(async() => await MethodAsync()); 
Task.Run(() => PrepareDashBoard()); 

2) 버튼 클릭 이벤트에서 비동기 메서드를 호출해야하는 경우?

// A. 
private void Button_Click(object sender, EventArgs e) 
{ 
    //A Task Run call from questions 1) a or b with call to Wait or Result (if return something) 
} 

// B 
private async void Button_Click(object sender, EventArgs e) 
{ 
    await MethodAsync(); 
} 
+0

귀하의 질문에 대해서는 설명서 및 표시된 사본을 통해 답변을 얻을 수 있습니다. –

답변

1

TL; DR : 당신은 의미가 (async 함수 반환 유형의 정의에서 제외) asyncawait와 함께 작업 병렬 라이브러리 (Task<T> 등)를 사용하여 직접 혼합하지 마십시오 이해할 때까지.

도 핸들러 그냥 윈폼 런타임 스레드 관리 (그래서 모든 GUI 상호 작용을 하나 개의 스레드에 머물를) 처리하는 방법을 알고

var res = await theFunction(args); 

사용 윈폼없이 비동기 함수를 호출합니다.

Re. Q1 :

a. 비동기 적으로 비동기 메서드를 호출하기위한 새로운 비동기 작업을 시작하고 내부 작업이 실행될 때 완료됩니다. 이것은 당신이 원하는 것일 확률이 매우 낮습니다.

b. 비동기 작업에서 람다를 실행하면 람다가 완료 될 때 작업 완료로 표시됩니다.

추신. C# 5가 출시되었을 때 여기서 대답보다 훨씬 더 자세하게 async과 WinForms의 상호 작용을 다루는 기사가 많이있었습니다.

+0

이 두 코드 줄의 차이점은 무엇입니까? 코드 라인은'Task.Run (async() => MethodAsync()를 기다리고 있습니다.)' 'Task.Run (>) PrepareDashBoard()); 그리고 제가 정정했다면, 비동기로 Task.Run을 사용하여 직접 섞어서 기다리시겠습니까? –

+0

기다리지 않고 비동기 메서드를 실행하는 올바른 방법은 무엇입니까? –

+0

@ManosKanellopoulos : 복잡합니다. (Task 의'Result' 속성을 사용하는 간단한 경우는 실행 컨텍스트 (IIRC)를 처리하지 않습니다). 그러므로 : 문서를 찾아서 읽으십시오. – Richard