본문으로 바로가기

Task 기반 AsyncCallback

category Development/C# 2014.10.01 15:46

.Net 4.0 기반에서 Task class를 사용한 AsyncCallback 예제입니다.

 

public class ServiceClass { public void GetData(Action callback) { Task.Factory.StartNew(Request).ContinueWith(o => { callback(o.Result); }, TaskScheduler.FromCurrentSynchronizationContext()); } private string Request() { return "suceess"; } }

 

GetData의 인자로 callback delegate를 넘겨줍니다.

 

Task<string>.Factory.StartNew 로 Task를 시작해 줍니다.

Request() 함수에서 결과를 return 해주면, ContinueWith 함수에서 결과 값을 Callback invoke해주는 간단한 소스 입니다.

여기 중요한건, ContinueWith 파라메터로 TaskScheduler.FromCurrentSynchronizationContext() 넣어 주는 부분입니다.

이 옵션을 하지 않으면 call 구현부에서 UI Thread에 접근하면 exception 메세지를 보시게 됩니다.


다음은 실제 사용하는 코드입니다.

public class DemoClass
{
    void OnButtonClick()
    {
        SeviceClass svc = new SeviceClass();
        svc.GetData(OnCallback);
    }

    void OnCallback(string result)
    {
        textBlock.Text = result;
    }
}

 

 

Task는 .net 4.0에 생긴 작업기반의 thread라고 생각하시면 될것 같습니다. 재미있고 유용한 기능이 많이 있습니다.

 

그런데 여기서 Request함수에 파라미터를 넣고 싶다면 어떻게 해야 할까요?

public class ServiceClass
{
    public void GetData(Action callback, int num)
    {
        Task.Factory.StartNew(Request, num).ContinueWith(o =>
        {
            callback(o.Result);
        }, TaskScheduler.FromCurrentSynchronizationContext());
    }
 
    private string Request(object num)
    {
        int n = num as int;
        return n.ToString() + "suceess";
    }
}

 

위와 같이 Thread에 파라미터를 전달 하는 방식과 동일하게, object 형식으로 받아 처리하면 됩니다.

 

MSDN System.Threading.Tasks

 

 

'Development > C#' 카테고리의 다른 글

Async, Await를 이용한 비동기 프로그래밍  (0) 2015.04.07
WPF MVVM 패턴  (0) 2014.10.30
Task 기반 AsyncCallback  (0) 2014.10.01
WPF UI 업데이트 반영  (0) 2014.07.14
enum의 Flag 연산  (0) 2014.05.15
XAML 요소의 네임스페이스와 CLR 타입 매핑  (0) 2014.05.09

댓글을 달아 주세요