2017-02-05 2 views
0

로깅 라이브러리를 만들었고 DB에 항목을 만들 때 로그 메서드가 오류 번호 (PK)를 반환합니다.이 번호는 사용자에게 오류 메시지의 일부로 알립니다. UI. 그들은 팀을 지원하기 위해 말할 때 그 열쇠를 참고 자료로 사용합니다.비동기 메서드에서 비동기 라이브러리 메서드 사용

그리고는 다음과 같은 작업을 수행하는 비동기 방법이 있습니다

public class Logger 
{ 
    public async Task<string> LogAsync(Exception ex) 
    { 
    return await DoLogAsync(ex); 
    } 

    // some private method, with multiple optional parameters 
    private Task<string> DoLogAsync(Exception ex) 
    { 
    return Task.Run(() => Log(ex)); 
    } 
} 

참고 : 나는 인정이 비동기 버전은 아무것도 단순히 동기 방법, 로그 (랩), 작업에 .운영. 나는 확실하지 않다, 그 밖의 무엇이하게되어야한다!

지금, 나는 아래처럼 내 모든 API를 위의 로그() 메소드를 사용하는 계획입니다 :

public Result<MyObject> Get() 
{ 
    var result = new Result<MyObject>(); 

    try 
    { 
    throw new DivideByZeroException(); 
    } 
    catch (DivideByZeroException ex) 
    { 
    string errorId = await _logger.LogAsync(ex); 
    response.AddErrorMessage("Please Contact Admin with this error #"+errorId); 
    } 

    return result; 
} 

일 이상으로 만들기 위해, 나는 API 방식 비동기을해야, 로거 호출을 기다리고 있기 때문입니다.

  1. 로거 용으로 API 호출을 비동기로 변경하지 않으려면 어떻게해야합니까? 이 작품을 만들 수있는 다른 가능성은 무엇입니까?
  2. LogAsync()이 실제로 도움이 될 것이라고 생각하십니까? 내 UI 스레드가 오류 번호가 반환되기를 기다리는 중입니다. 그렇다면 동기화 메서드를 호출하지 않는 이유는 무엇입니까?
  3. Log() 메쏘드가 거의 없습니다. 오류 번호가 필요하지 않습니다. 그 대신에 일종의 로그 - 앤 - 포겟 (log-and-forget)입니다. UI가 아무 것도 기대하지 않기 때문에 이러한 시나리오에서 비동기 버전이 도움이 될 것이라고 생각하십니까?

답변 : 질문 1에 대한은,이 작품 : Waiting for async/await inside a task

2 또한

, 3 가지는 ADO.Net 구현 오히려 Task.Run

보다는
+0

이 웹 응용 프로그램입니다 같은? – JohanP

+0

은 C# ... 중순에 태그를 넣어주세요 :) – ymz

+1

C#은 언어입니다. ASP.Net 응용 프로그램과 웹 API에 C#을 사용할 수 있습니다. – JohanP

답변

0

당신이 만약, 많은 의미를 웹 API를 사용하는 경우 asyncLog 메서드가 아닌 경우 async 메서드는 사용하지 않을 것입니다. Stephen Cleary의 답변 this을 살펴보십시오.

+0

와우 .. 그래서 비동기 메서드를 노출 할 필요가 없습니다; 오히려 내가 내부에서 ADO.Net 비동기 메서드를 활용할 것입니다. 감사합니다 – Skip

+1

당신은 DB 액세스에 대한 귀하의 응용 프로그램에서 ADO.Net을 사용하고 있다면 그렇습니다. 당신은 그것의 async 메소드를 사용해야합니다. 이것은 당신의'Log' 메쏘드가 여전히'async' tho가 될 것이라는 것을 의미합니다. 그러나 당신은'Task.Run'에 포장하지 않아도됩니다. – JohanP

+0

더 많은 조언을 해 주셔서 감사합니다. 예; 나는 이것을 성공적으로 활용할 수있다. – Skip

0

코드에서 async-await 접근 방식을 사용하기 시작하면 async이 응용 프로그램의 전체 파이프 라인에 퍼집니다.

그래서

난 그냥 로거를 위해, 내 API 호출 비동기를 변경하는 것을 방지하는 방법

? 이 작품을 만들 수있는 다른 가능성은 무엇입니까?

답변 : async

당신이 생각하십니까 사용하지 마십시오, LogAsync은() 정말 도움이 될 것입니다? 내 UI 스레드는 어쨌든 반환 될 오류 번호를 기다리는거야, 왜 그냥 동기화 메서드를 호출?

답변 : 기다리는 동안 UI가 "반응 형"입니다. 예를 들어 사용자는 다른 창에서 응용 프로그램의 창을 이동하거나 최소화 할 수 있습니다.

오류 번호가 필요없는 몇 가지 Log() 메소드가 return, log-and-forget 종류에 있습니다. UI에서 아무 것도 기대하지 않기 때문에 이러한 시나리오에서 비동기 버전 인 이 도움이 될 것이라고 생각하십니까?

답변 : 이전 대답

+0

감사합니다. 따라서 API를 비동기로 만드는 대신 다른 게시물에서 제안한 사람과 같이 다음과 같이 사용하고 싶습니다. var t = Task.Run (async() => {await lIB.LogAsync();}); 어떤 측면이든 그 접근 방식에 영향을 미칩니 까? – Skip

+0

부작용 : 아무것도하지 않기 위해 다른 스레드를 예약/생성하여 자원을 낭비합니다. IO 작업 (데이터베이스 쿼리가 있음)에서 스레드는 요청을 보내고 응답을 기다립니다. – Fabio

+0

감사합니다. 그것은,이 시나리오에서 승/비동기 더 나은 것 같아요 – Skip

관련 문제