2016-11-14 3 views
1

TaskTask<T>을 반환하는 메서드를 제공하는 타사 DLL을 사용하고 있습니다. 이 어셈블리 또는 인터페이스에 대한 제어권이 없기 때문에 저자의 생각에 따르면 메서드의 이름이 Async()이므로 비동기 적이어야합니다.비동기 코드가없는 경우 Task를 반환하는 타사 인터페이스를 어떻게 처리합니까?

그렇다면 실제로 비동기 코드가 실행되고 있지 않으면 인터페이스를 올바르게 구현하는 방법은 무엇입니까? 또한

public class FooBar : IFoo 
{ 
    public async Task DoWorkAsync() 
    { 
     // Do Some Work 

     await Task.Yield(); 
    } 

    public async Task<int> GetValueAsync() 
    { 
     // Do Some Work 
     var result = ...; 

     return Task.FromResult(result); 
    } 
} 

:

public interface IFoo 
{ 
    Task DoWorkAsync(); 

    Task<int> GetValueAsync(); 
} 

내 시도는 다음이었다 저자가 Task/Task<T>을 반환 메소드 만 노출의 올바른

  • 이 되었습니까?
  • 접미사 메서드 이름에 * Async()가 올바른지 확인하십시오. 이름에 비동기을 추가하지 않고 비동기 메소드를 작성하면 코드 분석이 불평하지 않습니다.
+2

나는'Async' 메소드를 호출 할 때 '예'라고 말하고 싶습니다. 명확하고 단순하게 만듭니다. 당신이 업 그레 이드하고'GetSomething'과'GetSomethingAsync' 메소드를 갖기 위해 하위 호환성을 유지하려고 할 때. – rbm

+0

나는 일반적으로 귀하의 두 가지 접근 방식 중 하나를 수행합니다. 기다릴 것이 아무것도 없다면 기다릴 것이 없다. 불필요한 것 같지만 제 3 자 라이브러리는 그대로 있습니다. – David

+0

@David : 두 가지 방법이 있습니다. 두 가지 방법이 있습니다. 하나는 기술적으로 반환하지 않기 때문에 'Task '대신 'Task' 만 사용하는 것입니다. – michael

답변

3

비동기 작업이없는 경우 async 키워드를 포함하지 마십시오. GetValueAsnyc 함수가 거의 정확 했으므로 async을 삭제해야했습니다. DoWorkAsync의 경우 비동기로 표시하고 완료된 작업을 반환하면 안됩니다. 코드가 느리고 당신은 당신이 할 수있는 경우에 찾고 고려할 오랜 기간 동안 UI를 차단 끝날 경우

public class FooBar : IFoo 
{ 
    public Task DoWorkAsync() 
    { 
     // Do Some Work 

     //If you can use .NET 4.6 
     return Task.CompletedTask; 

     //For older versions, the thing you pass in does not matter, I like to use bool. 
     return Task.FromResult(false); 
    } 

    public Task<int> GetValueAsync() 
    { 
     // Do Some Work 
     var result = ...; 

     return Task.FromResult(result); 
    } 
} 

그러나, 실제로 비동기 인 혹은 코드를 포장 코드를 다시 쓰기 백그라운드 스레드에 있지만 마지막 수단이면 백그라운드 스레드 만 수행합니다.