2016-08-30 4 views
2

async/await을 사용하여 개체를 반환하는 함수를 만들었습니다. 내가 전달하는 모든 객체를 반환 할 수 있도록 함수를 범용으로 만들고 싶습니다. 코드는 반환되는 객체를 제외하고는 상용구입니다. GetAsync를 호출하여 올바른 객체를 반환 할 수 있기를 원합니다.일반 비동기 작업 함수 만들기

+0

개체가 루트 개체입니까? https://msdn.microsoft.com/en-us/library/system.object(v=vs.110).aspx –

+0

'GetAsync'의 결과에'.Result'를 사용하면 안됩니다. UI 스레드에서 호출하면 교착 상태가 발생합니다. –

+2

'getPatronById'가 비동기가 아닌 이유는 무엇입니까? 그것은 비동기 적이어야하고'.Result' 나'GetAsync'를 사용하지 말아야합니다. async가 아니어야하고'HttpClient' 대신에'WebClient'를 사용해야하며 동기 메서드를 사용해야합니다. '.Result'를 사용하면 프로그램이 잠길 수 있습니다. –

답변

4

일반적인 방법은 어떻게됩니까?

private async Task<T> GetAsync<T>(string uri) 
{ 
    var client = GetHttpClient(uri); 
    var content = await client.GetStringAsync(uri); 
    var serializer = new JavaScriptSerializer(); 
    var t = serializer.Deserialize<T>(content); 
    return t; 
} 

일반적으로, 당신은 순서대로는 다른 클래스의 방법으로 사용할 수 있으며, 다른 클래스에이 방법을 배치하고 public해야한다. 이 메서드를 호출하는 방식에 대해서는

, 다음 시도 할 수 :

// I capitalized the first letter of the method, 
// since this is a very common convention in .NET 
public Patron GetPatronById(string barcode) 
{ 
    string uri = "patrons/find?barcode=" + barcode; 
    var Patron = GetAsync<Patron>(uri).Result; 
    return Patron; 
} 

: 위의 코드에서 난 당신이 다른 클래스로 GetAsync를 이동하지 않은 것으로 가정한다. 그것을 움직이면, 당신은 약간의 변화를 가져야 만합니다.

업데이트하는 것은 당신이 메모는 무엇을 의미하는 다음과 같은 아니에요. Yuval이 아래에서했던 것처럼 GetPatronById도 작업 함수로 만들 필요가 있습니까?

나는 이런 식으로 뭔가 의미 :

// The name of the class may be not the most suitable in this case. 
public class Repo 
{ 
    public static async Task<T> GetAsync<T>(string uri) 
    { 
     var client = GetHttpClient(uri); 
     var content = await client.GetStringAsync(uri); 
     var serializer = new JavaScriptSerializer(); 
     var t = serializer.Deserialize<T>(content); 
     return t; 
    } 
} 

public Patron GetPatronById(string barcode) 
{ 
    string uri = "patrons/find?barcode=" + barcode; 
    var Patron = Repo.GetAsync<Patron>(uri).Result; 
    return Patron; 
} 
+0

나는 귀하가 귀하의 쪽지를 읽지 않고 있습니다. Yuval이 아래에서했던 것처럼 GetPatronById도 작업 함수로 만들 필요가 있습니까? – jriggs

+0

@jriggs 업데이트를 살펴보십시오. 타이 – Christos

2

일반 쉽게 수행 할 수 있습니다 :

private async Task<T> GetAsync(string uri) 
{ 
    var client = GetHttpClient(uri); 
    var content = await client.GetStringAsync(uri); 
    return JsonConvert.DeserializeObject<T>(content); 
} 

것들 참고 :

  1. JavaScriptSerializer는 연령대에 사용되지 않습니다 , 사용하지 마십시오. 대신 Json.NET을 사용해보세요.

  2. 이 :

    Patron Patron = GetAsync(uri).Result; 
    

    은 위험하며, 특히 웹 API에 잠재적 교착 상태가 발생할 수 있습니다. 당신은 "모든 방법 비동기"갈 필요가 :

    public Task<Patron> GetPatronByIdAsync(string barcode) 
    { 
        string uri = $"patrons/find?barcode={barcode}"; 
        return GetAsync<Patron>(uri); 
    } 
    

그리고 만 최상위 수준 호출자

Taskawait이 필요합니다. 아마도 어떤 컨트롤러 동작 :

public async Task SomeAction() 
{ 
    await GetPatronByIdAsync("hello"); 
}